3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
在C語(yǔ)言中,所有指針類(lèi)型的表示可能不同。所以,是的,int *
不同于void *
??梢院茈y(或不可能)找到能夠說(shuō)明這種差異的真實(shí)平臺(tái),但在概念層面,差異仍然存在。
換句話(huà)說(shuō),通常情況下,不同的指針類(lèi)型具有不同的表示。int *
不同于void *
和不同double *
。就C語(yǔ)言而言,您的平臺(tái)使用相同的表示形式void *
并且int *
只不過(guò)是巧合。
一些指針類(lèi)型都要求有相同的表述語(yǔ)言狀態(tài),其中包括void *
主場(chǎng)迎戰(zhàn)char *
,指向不同的結(jié)構(gòu)類(lèi)型,或者說(shuō),int *
和const int *
。但這些只是一般規(guī)則的例外。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
其他人已經(jīng)充分解決了傳遞int *一個(gè)原型函數(shù)的情況,該函數(shù)具有固定數(shù)量的參數(shù),這些參數(shù)需要不同的指針類(lèi)型。
printf不是這樣的功能。它是一個(gè)可變參數(shù)函數(shù),因此默認(rèn)參數(shù)升級(jí)用于其匿名參數(shù)(即格式字符串之后的所有內(nèi)容),并且如果每個(gè)參數(shù)的提升類(lèi)型與格式效應(yīng)器所期望的類(lèi)型不完全匹配,則行為未定義。特別是,即使 int *并且void *具有相同的表示,
int a;
printf("%p\n", &a);
有未定義的行為。
這是因?yàn)檎{(diào)用幀的布局可能取決于每個(gè)參數(shù)的確切具體類(lèi)型。為指針和非指針類(lèi)型指定不同參數(shù)區(qū)域的ABI已經(jīng)在現(xiàn)實(shí)生活中發(fā)生(例如,Motorola 68000希望您盡可能地在地址寄存器和數(shù)據(jù)寄存器中的非指針中保持指針)。我不知道任何真實(shí)的ABI會(huì)分離不同的指針類(lèi)型,但它是允許的,聽(tīng)到一個(gè)我也不會(huì)感到驚訝。
- 3 回答
- 0 關(guān)注
- 1210 瀏覽
添加回答
舉報(bào)