3 回答

TA貢獻1869條經(jīng)驗 獲得超4個贊
陣列的名稱通常計算到所述陣列的所述第一元素的地址,所以array
與&array
具有相同的值(但不同類型的,所以array+1
和&array+1
將不如果數(shù)組超過1個元件長是相等的)。
這有兩個例外:當(dāng)數(shù)組名稱是sizeof
或一元&
(address-of)的操作數(shù)時,名稱指的是數(shù)組對象本身。因此,sizeof array
為您提供整個數(shù)組的字節(jié)大小,而不是指針的大小。
對于定義為的數(shù)組T array[size]
,它將具有類型T *
。當(dāng)/如果你增加它,你會到達數(shù)組中的下一個元素。
&array
求值為相同的地址,但給定相同的定義,它會創(chuàng)建一個類型的指針T(*)[size]
- 即,它是指向數(shù)組的指針,而不是指向單個元素的指針。如果遞增此指針,它將添加整個數(shù)組的大小,而不是單個元素的大小。例如,使用以下代碼:
char array[16];printf("%p\t%p", (void*)&array, (void*)(&array+1));
我們可以期望第二個指針比第一個指針大16(因為它是一個16個字符的數(shù)組)。由于%p通常以十六進制轉(zhuǎn)換指針,因此它可能類似于:
0x12341000 0x12341010

TA貢獻1772條經(jīng)驗 獲得超6個贊
在C中,當(dāng)您在表達式中使用數(shù)組的名稱(包括將其傳遞給函數(shù))時,除非它是address-of(&
)運算符或sizeof
運算符的操作數(shù),否則它將衰減為指向其第一個元素的指針。
也就是說,在大多數(shù)情況下array
,相當(dāng)于&array[0]
在這兩個類型和值。
在您的示例中,my_array
具有在將其傳遞給printf時char[100]
衰減到的類型char*
。
&my_array
有類型char (*)[100]
(指向數(shù)組100的指針char
)。因為它是操作數(shù)&
,所以這是my_array
不會立即衰減到指向其第一個元素的指針的情況之一。
指向數(shù)組的指針具有與指向數(shù)組第一個元素的指針相同的地址值,因為數(shù)組對象只是其元素的連續(xù)序列,但指向數(shù)組的指針與指向元素的指針的指針具有不同的類型。那個數(shù)組。當(dāng)您對兩種類型的指針進行指針運算時,這很重要。
pointer_to_array
具有類型char *
- 初始化為指向數(shù)組的第一個元素,因為它是my_array
初始化表達式中的衰減 - 并且&pointer_to_array
具有類型char **
(指向a的指針char
)。
其中:( my_array
在衰減之后char*
),&my_array
并且pointer_to_array
都直接指向數(shù)組或數(shù)組的第一個元素,因此具有相同的地址值。
- 3 回答
- 0 關(guān)注
- 779 瀏覽
添加回答
舉報