數組名與數組名取地址的差別

定義一個×××數組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;
}

spacer.gifwKiom1bybtLy-8L2AABXLzGBcLs363.png

咱們能夠看到,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;
}

spacer.gifwKioL1byb5rAVaroAABX8nt2HZk387.png

咱們能夠看到,給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;
}

spacer.gifwKiom1byby-ASv8aAABYDSPxBHQ954.png

&arr表明數組地址,但爲何在這裏sizeof(&arr)是4而不是40呢?get



一樣的:it

int main()
{
     char arr[] = "123456" ;
     printf( "sizeof(&arr)=%d\n" , sizeof (&arr));
     system( "pause" );
    return 0;
}

wKiom1byb1XD421sAABTX6SSSdg981.png

spacer.gif



這時由於,sizeof(arr)中將arr看作是一個數組類型來求取大小,其中arr則表明的是數組大小,而不是數組首元素地址。

而sizeof(&arr)中,&arr表明的是地址類型,在32位操做平臺下,對一個地址求取內存大小其結果爲4,在64位下其結果可能爲8。


數組名自己在計算是會自動轉化爲數組首元素的地址,可是在sizeof()調用的時候卻不作轉化。

相關文章
相關標籤/搜索