#include
void main( void )
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return;
}
代碼的輸出是: 2, 5
這是C語言裡一個比較容易搞混的地方,很多人直接把數組名當成數組第一個元素的位址,其實兩者間有一點差異的。大多情況下,數組名确實可以當做數組第一個元素的位址,但這隻是因為當數組名在表達式中使用時,被轉換成了第一個元素的位址。
我記得沒錯的話,在兩種情況下,資料名必須被當成具有數組類型的變量: 一個是對數組取位址得到的是指向一個數組的指針,第二是 sizeof(a) 的得到的是數組所占的位元組數。
是以對于(&a + 1), &a得到的是數組指針,數組指針加一就等于 (char*)&a + sizeof(a), 得到的的是一個緊靠數組後的一個位址,然後對這個位址進行類型轉換成int 的指針,對這個指針加一就得數組最後一個元素的位址。
正是因為數組這種特點,比較好的做法是用 &a[0] 來表示數組第一個元素的位址。
其實函數名和數組一樣具有這種特點,例如對于函數 void func(), 一般情況下 &func 和 func 是可以互用的。
記住: 取位址符 & ,是把符号後面元素的整個對象作為一個整體, 深刻了解 &a[0] 與 &a
#include
int main()
{
int a[5]={1,2,3,4,5};
int *ptr= (int *)(int *)(&a);
int *ptr2 = a; //數組a的首個元素的位址,相當于 &a[0]--->把單個元素作為對象
int *ptr3 = (int *)&a; //數組a的指針,把整個數組a作為對象, (int *)(&a+1)代表把整個數組作為對象,指針向後移動,代表的是a[5]的位址
printf("*ptr=%d *ptr2=%d ptr3=%d\n",*ptr,*ptr2,*ptr3);
}
輸出最終結果是一樣的!