1. 程式人生 > >利用指向陣列的指標來得到陣列的最後一個數

利用指向陣列的指標來得到陣列的最後一個數

今天在一個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]。