數組和指針一道練習題(2015.12.9)


複習到這種題目,之前看過,還是忘了,描述如下:

main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}

輸出爲:2,5

請解釋以上代碼的輸出結果。

答案如下:

*(a+1)其實很簡單就是指a[1],輸出爲2.

問題關鍵就在於第二個點,*(ptr-1)輸出爲多少?

解釋如下,&a+1不是首地址+1,系統會認爲加了一個整個a數組,偏移了整個數組a的大小(也就是5個int的大小)。所以int*ptr=(int*)(&a+1);其實ptr實際是&(a[5]),也就是a+5.

原因爲何呢?

&a是數組指針,其類型爲int(*)[5];

而指針加1要根據指針類型加上一定的值,不同類型的指針+1之後增加的大小不同,a是長度爲5的int數組指針,所以要加5*sizeof(int),所以ptr實際是a[5],但是ptr與(&a+1)類型是不一樣的,這點非常重要,所以ptr-1只會減去sizeof(int*),a,&a的地址是一樣的,但意思就不一樣了,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章