[英]Why sizeof(array) and sizeof(&array[0]) gives different results?
#include <stdio.h>
int main(void){
char array[20];
printf( "\nSize of array is %d\n", sizeof(array) ); //outputs 20
printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}
上面的代碼給出20
為sizeof(array)
和4
對sizeof(&array[0])
我所知道的不是將數組作為參數,而是可以傳遞它的第一個元素。 他們不應該給出與20相同的輸出嗎? 為什么&array[0]
得到4結果? 據我所知,char存儲在1個字節中?
在表達式sizeof array
, array
不會轉換為指針類型。
C11,§6.3.2.1左值,數組和函數指示符
除非它是
sizeof
運算符 ,_Alignof
運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則將具有類型''數組類型''的表達式轉換為表達式輸入''指向類型'的指針,指向數組對象的初始元素,而不是左值。
因此,它的類型是char[20]
,而不是char *
。 這種類型的大小是sizeof(char) * 20 = 20
字節。
C11,第6.5.3.4本
sizeof
和_Alignof
運營商
sizeof
運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。 大小由操作數的類型確定 。
&array[0]
type是char *
。 這就是sizeof(&array[0])
給出與sizeof(char *)
相同的結果sizeof(char *)
機器上的4個字節)的原因。
變量array
是一個20 char
的數組,表達式sizeof(array)
值等於20個chars
數組的sizeof字節,即20
。
&array[0]
是一個指針 。 sizeof
返回指針的大小,在您的機器中為4。
表達式&array[0]
是一個指針,因此sizeof
運算符返回指針的大小。
sizeof(array)
給出總數組的大小, sizeof(&array[0])
給你sizeof(char *)
你的問題是Array and pointer are not same
完美例子Array and pointer are not same
。 數組可以充當指針。 看看這里 。
&array[0]
返回指向數組第一個索引的指針。 在指針上使用sizeof
運算符將產生指針的大小(取決於ABI),在您的情況下,它是4。
sizeof(&array[0])
返回指向char的指針的大小。 array[0]
產生一個char, &
返回一個指向char的指針。 您的編譯器使用4個字節作為指針(32位)。
“數組”本身是常量指針,你不能將它解決到不同的位置。 是的,數組地址與&array [0]相同,它來自& (array + 0),它等於& (數組)。 我們知道&*被淘汰了,所以我們又回到了“陣列”。 所以“array”與“&*(array + 0)”相同但是對於sizeof運算符,操作數必須是數組表示法,而不是指針表示法。 澄清:
char * data = {“今天是星期天”}; ...指針符號
char data [] = {“今天是星期天”}; ...數組符號
在帶指針表示法的第一個例子中,sizeof(data)將是存儲地址所需的字節大小,在我的系統上為8。 在第二個示例中,sizeof(data)將給出數組占用的字節數,即字符串中的15個字符。 但是如果使用像sizeof(data + 0)這樣的指針表示法,結果將是存儲地址所需的字節數,在我的系統中為8。
sizeof運算符結果與指針和帶指針表示法的數組相同。
我認為“數組”本身是常量指針,你無法將它解決到不同的位置。 確實,我們可以這樣寫:數組與&array [0]相同,它是從&*(數組+ 0)派生而來的,它等於&*(數組)。 我們知道&*被淘汰了,所以我們又回到了“陣列”。 因此“數組”與“&*(數組+ 0)”相同。在某些情況下,術語應該相同,但對於sizeof運算符則不一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.