3 回答

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

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

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