定義一個×××數組arr[10],其中arr、&arr在不一樣的狀況下表明的地址是不一樣的。數組
通常狀況下arr表明的是數組首元素的地址,而&arr表明的則是數組的地址。 雖然數組首元素地址與數組地址的內存地址相同,可是他們表明的含義卻不一樣,因此對他們進行運算時,所得結果也不一樣。ide
例如:在scanf()、printf()函數和形參中,arr表明的是數組首元素的地址。函數
int main() { int arr[10] = { 0 }; printf( "arr=%p\n", arr); printf( "&arr=%p\n", &arr); system( "pause"); return 0; }
咱們能夠看到,arr在內存中的地址與&arr在內存中的地址大小是相同的。url
可是:spa
int main() { int arr[10] = { 0 }; printf( "arr=%#p\n", arr+1); printf( "&arr=%#p\n", &arr+1); system( "pause"); return 0; }
咱們能夠看到,給arr和&arr+1所得的結果是不一樣的,&arr+1恰好比arr+1大36,是9個×××字節的長度,這時由於arr表明的是數組首元素的地址,加1的話,前進一個元素,也就是4個字節,而&arr表明的是數組地址,加1則跳過整個數組。blog
但還有一些狀況,arr則表明的是數組的大小:內存
例如:在關鍵字sizeof()中,arr卻表明的是整個數組的大小v8
int main() { int arr[10] = { 0 }; printf( "sizeof(arr)=%d\n", sizeof (arr)); printf( "sizeof(&arr)=%d\n", sizeof (&arr)); system( "pause"); return 0; }
&arr表明數組地址,但爲何在這裏sizeof(&arr)是4而不是40呢?get
一樣的:it
int main() { char arr[] = "123456" ; printf( "sizeof(&arr)=%d\n" , sizeof (&arr)); system( "pause" ); return 0; }
這時由於,sizeof(arr)中將arr看作是一個數組類型來求取大小,其中arr則表明的是數組大小,而不是數組首元素地址。
而sizeof(&arr)中,&arr表明的是地址類型,在32位操做平臺下,對一個地址求取內存大小其結果爲4,在64位下其結果可能爲8。
數組名自己在計算是會自動轉化爲數組首元素的地址,可是在sizeof()調用的時候卻不作轉化。