3 回答

TA貢獻1853條經(jīng)驗 獲得超9個贊
鑒于int a[10]
,雙方a
并&a
產(chǎn)生相同的地址,是的,但它們的類型是不同的。
a
是類型的int[10]
。當(dāng)它被隱式轉(zhuǎn)換為指針類型時,指針是類型int*
并指向數(shù)組的初始元素。&a
是類型int (*)[10]
(即指向十個整數(shù)數(shù)組的指針)。因為數(shù)組中沒有填充,它們都會產(chǎn)生具有相同值的指針,但指針具有不同的類型。
函數(shù)類似于數(shù)組,但不完全相同。你的功能foo
是類型的double(double)
。無論何時foo
在表達式中使用并且不是一元運算&
符的操作數(shù),它都會隱式轉(zhuǎn)換為指向其自身的指針,該指針屬于類型double(*)(double)
。
因此,出于所有實際目的,函數(shù)的名稱和指向同一函數(shù)的指針是可互換的。有一些細微之處,我在回答“為什么所有這些瘋狂的函數(shù)指針定義都能正常工作?真正發(fā)生了什么?”時回答了所有這些細微之處。(這個問題是關(guān)于C ++的問題,但C ++中非成員函數(shù)的規(guī)則與C中的函數(shù)相同。)

TA貢獻1786條經(jīng)驗 獲得超13個贊
不,沒有專門用于指向函數(shù)/數(shù)組的額外存儲空間。
大多數(shù)變量variable_name
除了獲取該變量的地址之外還有其他含義,因此您需要使用它&variable
來獲取地址。
對于函數(shù)或數(shù)組,function_name
(本身,后面沒有括號)沒有任何其他含義,因此將它解釋為獲取函數(shù)的地址沒有問題。
同樣反過來:普通指針需要顯式解除引用,但指向函數(shù)的指針不會(再次,因為沒有其他合理的解釋),所以給定一個指向函數(shù)的指針,如:
int (*func)(param_list);
以下是彼此相同的 - 都調(diào)用任何功能func
點:
(*func)(params);func(params);

TA貢獻1816條經(jīng)驗 獲得超4個贊
基本上,由于函數(shù)名稱是“已知”的函數(shù),因此&并非絕對必要。對于數(shù)組,此行為是相同的?;叵胍幌?,函數(shù)本身不是變量,因此它的行為與您有時可能會有的不同。如果你有第二版K&R,你可以查看5.11節(jié)關(guān)于功能的指示,或者最后的參考手冊,
A7.1節(jié)指針生成:如果某個類型T的表達式或子表達式的類型是“T的數(shù)組”,那么表達式的值是指向數(shù)組中第一個對象的指針,表達式的類型是改為“指向T” 這種轉(zhuǎn)換不會取代表達式是一元&運算符的操作數(shù),...類似地,類型為“函數(shù)返回T”的表達式除非用作&運算符的操作數(shù),否則將轉(zhuǎn)換為“指針函數(shù)返回T.“
A7.4.2節(jié)地址運算符:一元&運算符獲取其操作數(shù)的地址....結(jié)果是指向左值引用的對象或函數(shù)的指針。如果操作數(shù)的類型是T,則結(jié)果的類型是“指向T的指針”。
據(jù)我所知,C99也是如此。
- 3 回答
- 0 關(guān)注
- 541 瀏覽
添加回答
舉報