3 回答

TA貢獻1848條經驗 獲得超10個贊
這是從C繼承的功能。
在C語言中,之所以允許使用它,主要是因為函數名稱本身并不意味著什么。您可以使用實際功能做的就是調用它。如果您不打電話,唯一可以做的就是獲取地址。由于沒有歧義,因此只要函數名稱后不帶a (
來表示對該函數的調用,該名稱就等于該函數的地址。
這實際上與語言的另一部分相似-數組的名稱計算為該數組第一個元素的地址,除非在相當有限的情況下(用作&
或的操作數sizeof
)。
由于C允許這樣做,所以C ++也可以這樣做,主要是因為這仍然適用:您只能對函數進行調用或獲取其地址,因此,如果名稱后面沒有a (
來表示函數調用,那么名稱的計算結果就毫無歧義。

TA貢獻1853條經驗 獲得超18個贊
對于數組,使用address-of運算符時沒有指針衰減:
int a[2];
int * p1 = a; // No address-of operator, so type is int*
int (*p2)[2] = &a; // Address-of operator used, so type is int (*)[2]
這是有道理的,因為數組和指針是不同的類型,例如可以返回對數組的引用或將引用傳遞給函數中的數組。
但是,使用函數,還有其他可能的類型嗎?
void foo(){}
&foo; // #1
foo; // #2
假設只有#2給出了type void(*)(),那么類型將&foo是什么?沒有其他可能性。
- 3 回答
- 0 關注
- 504 瀏覽
添加回答
舉報