PHP中文网2017-04-17 14:00:17
陣列名,用來存取陣列元素的時候,它就表示陣列的首位址,而當你用它來存取陣列本身的時候,它就是陣列的位址。只不過數組的首位址與數組的位址相同而已。
a
表示 &a[0]
,a+1
表示 &a[1]
…在這個層次上,陣列名等效於可以存取陣列內部元素的指標。
&a
是對陣列這個『物件』取址,而 &a + 1
表示與陣列 a
規模相同的另一個陣列。在這個層次上,&a
等效於存取數組這個整體的指標-指向數組的指標。
PHP中文网2017-04-17 14:00:17
有一個方法可能可以幫你理解
執行下面的程式碼
int a[64];
printf("%x %x %x %x", a, a+1, &a, (&a)+1);
在我的機器上,運行結果是:
29fe10 29fe14 29fe10 29ff10
第一個結果和第二個結果差4,第三個結果和第四個結果差0x100
4剛好是int的長度,0x100(256)剛好是一個為長64的int數組的長度
a是這個陣列的首元素的位址,所以你才能用*(a+i)的方式存取第i個元素,而&a是這個陣列的位址,但因為一塊資料的位址是取其首字節的位址,所以他們的值相同
迷茫2017-04-17 14:00:17
char A[20][20][20][20];
printf("%x %x %x %x %x ", A[0][0][0] ,A[0][0],A[0], A, &A);
這五個值的也是一模一樣
PHP中文网2017-04-17 14:00:17
在C語言中,當數組名作為函數參數的時候,它會被轉換為指向數組第一個元素的指針,又因為數組第一個元素的位址就等於數組位址,所以這裡傳到printf裡的a
和&a
參數,對應它們在函數內部的物件的值是相等的,且都等與數組的位址。
阿神2017-04-17 14:00:17
a和&a的值都是位址,這兩個位址是相等的。
但是a和&a的型別不一樣,具體的說:
a的型別是int *
&a的型別是int (*)[2]
這個類型會影響指標加減運算的結果,所以a+1和(&a)+1結果不等。
在這個例子中,a+1比a多4個位元組,(&a)+1比&a多8位元組