利用指向陣列的指標來得到陣列的最後一個數
阿新 • • 發佈:2019-01-26
今天在一個CSDN部落格上看了一篇文章,是關於陣列與指標的問題,感覺挺好的,大致描述如下:
#include "stdio.h"
int main()
{
int a[5]={1,-100,3,2,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
輸出為:-100,5
請解釋以上程式碼的輸出結果。
解釋如下:
*(a+1)其實很簡單就是指a[1],輸出為-100。
問題關鍵就在於第二個點,*(ptr-1)輸出為多少?
解釋如下,&a+1不是首地址+1,系統會認為加了一個整個a陣列,偏移了整個陣列a的大小(也就是5個int的大小)。所以int *ptr=(int *)(&a+1);其實ptr實際是&(a[5]),也就是a+5.
Why?
&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]。