int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a怎麼樣和& a在內部解釋?當「a」是一個int數組時,爲什麼「a + 1」和「&a + 1」會給出不同的結果?
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,0};
printf("a = %u , &a = %u\n",a,&a);
printf("a+1 = %u , &a+1 = %u\n",a+1,&a+1);
}
a怎麼樣和& a在內部解釋?當「a」是一個int數組時,爲什麼「a + 1」和「&a + 1」會給出不同的結果?
好吧,a是數組第一個元素的地址,而& a是數組的地址,但顯然他們都有相同的地址。
然而,當你從一個指針添加(或減去)一個數字時,編譯器會考慮數據的大小,因此在你的情況下(假設int的大小是4字節),a + 1將比a更大4,因爲你將指針移動一個整數,但是& a + 1會增大40,因爲你更多的指針是前一個10個整數的指針。
這兩個語句都打印出地址,可能是爲了解釋指針算術。
a
和&a
是不一樣的,他們有不同的類型,但保持相同的內存地址。
&a
是int (*)[10]
類型(其作用類似於一個指針數組)
a
是int [10]
類型(其作用類似於一個指向單個元件)的
因此,當添加1保持的那些類型中心神。指針將被地址所包含類型的大小所偏移。偏移int的大小,即偏移到數組中的第二個元素。 &a+1
補償完全超過整個陣列。
這幾乎都是C中的所有類型:算術和大小。 – mathk 2010-06-07 12:49:57
爲了保持完整性,可以添加'&a [0]'是'int *'類型並且非常像'a'。 – Hugues 2013-09-18 20:10:07
@Brian R.Bondy所以我們可以使用'sizeof'來顯示它們的類型差異嗎? – sikisis 2015-12-21 10:10:12