int a[2]; printf("%x %x\n", a, &a); // a &a 输出一样
怎么解释这种现象
小伙看你根骨奇佳,潜力无限,来学PHP伐。
陣列名,用來存取陣列元素的時候,它就表示陣列的首位址,而當你用它來存取陣列本身的時候,它就是陣列的位址。只不過數組的首位址與數組的位址相同而已。
a 表示 &a[0],a+1 表示 &a[1]…在這個層次上,陣列名等效於可以存取陣列內部元素的指標。
a
&a[0]
a+1
&a[1]
&a 是對陣列這個『物件』取址,而 &a + 1 表示與陣列 a 規模相同的另一個陣列。在這個層次上,&a 等效於存取數組這個整體的指標-指向數組的指標。
&a
&a + 1
C風格陣列是平鋪在堆疊上的,其構成除了陣列元素之外又沒有其它成員。所以,數組首個元素和數組位址一樣不很正常嗎?要嘛怎麼叫「首個」元素呢。
有一個方法可能可以幫你理解執行下面的程式碼
int a[64]; printf("%x %x %x %x", a, a+1, &a, (&a)+1);
在我的機器上,運行結果是:29fe10 29fe14 29fe10 29ff10第一個結果和第二個結果差4,第三個結果和第四個結果差0x1004剛好是int的長度,0x100(256)剛好是一個為長64的int數組的長度
a是這個陣列的首元素的位址,所以你才能用*(a+i)的方式存取第i個元素,而&a是這個陣列的位址,但因為一塊資料的位址是取其首字節的位址,所以他們的值相同
char A[20][20][20][20]; printf("%x %x %x %x %x ", A[0][0][0] ,A[0][0],A[0], A, &A);
這五個值的也是一模一樣
如果一個變數儲存自己的位址,那麼對它取一萬次位址,也是它自己,
以上有誤。
在C語言中,當數組名作為函數參數的時候,它會被轉換為指向數組第一個元素的指針,又因為數組第一個元素的位址就等於數組位址,所以這裡傳到printf裡的a和&a參數,對應它們在函數內部的物件的值是相等的,且都等與數組的位址。
&a是陣列的位址
a是陣列首元素的首位址
&a + 1 已經跑到陣列外面了
a + 1是陣列的第二個元素的位址
a + 1
a和&a的值都是位址,這兩個位址是相等的。
但是a和&a的型別不一樣,具體的說:a的型別是int *&a的型別是int (*)[2]
這個類型會影響指標加減運算的結果,所以a+1和(&a)+1結果不等。 在這個例子中,a+1比a多4個位元組,(&a)+1比&a多8位元組
在C中,陣列名的值是指標常數,也就是陣列第一個元素的位址所以&a, a, &a[0] 三者是等價的
陣列名,用來存取陣列元素的時候,它就表示陣列的首位址,而當你用它來存取陣列本身的時候,它就是陣列的位址。只不過數組的首位址與數組的位址相同而已。
a
表示&a[0]
,a+1
表示&a[1]
…在這個層次上,陣列名等效於可以存取陣列內部元素的指標。&a
是對陣列這個『物件』取址,而&a + 1
表示與陣列a
規模相同的另一個陣列。在這個層次上,&a
等效於存取數組這個整體的指標-指向數組的指標。C風格陣列是平鋪在堆疊上的,其構成除了陣列元素之外又沒有其它成員。所以,數組首個元素和數組位址一樣不很正常嗎?要嘛怎麼叫「首個」元素呢。
有一個方法可能可以幫你理解
執行下面的程式碼
在我的機器上,運行結果是:
29fe10 29fe14 29fe10 29ff10
第一個結果和第二個結果差4,第三個結果和第四個結果差0x100
4剛好是int的長度,0x100(256)剛好是一個為長64的int數組的長度
a是這個陣列的首元素的位址,所以你才能用*(a+i)的方式存取第i個元素,而&a是這個陣列的位址,但因為一塊資料的位址是取其首字節的位址,所以他們的值相同
這五個值的也是一模一樣
如果一個變數儲存自己的位址,那麼對它取一萬次位址,也是它自己,
以上有誤。
在C語言中,當數組名作為函數參數的時候,它會被轉換為指向數組第一個元素的指針,又因為數組第一個元素的位址就等於數組位址,所以這裡傳到printf裡的
a
和&a
參數,對應它們在函數內部的物件的值是相等的,且都等與數組的位址。&a
是陣列的位址a
是陣列首元素的首位址&a + 1
已經跑到陣列外面了a + 1
是陣列的第二個元素的位址a和&a的值都是位址,這兩個位址是相等的。
但是a和&a的型別不一樣,具體的說:
a的型別是int *
&a的型別是int (*)[2]
這個類型會影響指標加減運算的結果,所以a+1和(&a)+1結果不等。
在這個例子中,a+1比a多4個位元組,(&a)+1比&a多8位元組
在C中,陣列名的值是指標常數,也就是陣列第一個元素的位址
所以
&a, a, &a[0] 三者是等價的