簡體   English   中英

為什么sizeof(array)和sizeof(&array [0])給出不同的結果?

[英]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
}

上面的代碼給出20sizeof(array)4sizeof(&array[0])

我所知道的不是將數組作為參數,而是可以傳遞它的第一個元素。 他們不應該給出與20相同的輸出嗎? 為什么&array[0]得到4結果? 據我所知,char存儲在1個字節中?

在表達式sizeof arrayarray不會轉換為指針類型。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM