[英]A pointer to function in c++
當我用指針指向函數時,我發現了一些東西並且不明白
我這樣做了:
#include <stdio.h>
int callback(void)
{
return 5;
}
void call(int (*cpmpare)(void))
{
int x;
x = cpmpare();
printf("%d", x);
}
void main()
{
int (*compare)(void);
int *a, b;
b = 5;
a = &b;
compare = callback;
printf("%p\n", &callback);
printf("%p\n", compare);
call(&callback);
}
我做了compare = &callback
而不是compare = callback
,它做了同樣的事情,比較得到了與回調相同的地址。
據我所知,比較指針和常規變量將是錯誤的。
函數(如數組)在某些上下文中會衰減為指針。 使用&function
或function
幾乎總是一樣的。 在你的例子中,情況確實如此。 這兩個語句在語義上是相同的:
compare = callback;
compare = &callback;
這兩個是:
call(&callback);
call(callback);
同樣,當您想使用函數指針時, *
也是可選的:
x = cpmpare();
x = (*cpmpare)();
C委員會決定(因為含義是明確的)函數的名稱(沒有后跟調用該函數的parens)將計算到函數的地址(與數組的名稱求值的方式大致相同)數組開頭的地址)。
官方措辭是(§C99,6.3.2.1/ 4):
函數指示符是具有函數類型的表達式。 除非它是sizeof運算符或一元&運算符的操作數,否則具有類型''函數返回類型''的函數指示符將轉換為具有類型''指向函數返回類型'的指針的表達式。
雖然我不確定Bjarne或C ++委員會對這個想法幾乎是如此興奮,但他們顯然決定同意這一點,所以在C ++中也是如此。 我認為他們對此不感興趣的(主要)原因是,盡管他們可以使用成員函數的名稱進行相同的操作,而該成員函數的名稱后面沒有parens來調用該成員函數,但他們選擇不 - 獲取指向成員函數的指針, 必須使用address-of運算符( &
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.