數組和指向數組的指針的關係

看下面的程序,輸入什麼?

#include<stdio.h>
 
int main()
{
         int a[] = {1, 2, 3, 4, 5};
         int *p = (int *)(&a+1);
         printf("p = %d\n", *a);
         printf("p = %d\n", *(a+1));
         printf("p = %d\n", *(p-1));

         return 0;
}

結果是:

p = 1
p = 2
p = 5

  1. a 其實就是一個指針 ,指向第一元素, 所以*a就是1
  2. a+1是指針的偏移,偏移大小由指針a指向的類型來決定,上例子中,a指向int 型,所以加1就執行下一個整型元素。
  3. 第3個怎麼解釋呢。 首先是&a, 是指針的指針, p指向 a偏移了1的位置. 這個1有多大?
    那要看a是什麼類型,上面定義a的時候是等價於int a[5] = {1, 2, 3, 4, 5}; 所以類似於 int b
    把類型和變量分開,b是int類型。 同樣,把int a [5]也分開,就是int[5] a 。所以a是 int[5]類型的。那麼&a就是指向一個int[5]類型的指針,這個指針加1,這個1的偏移量就是int[5]的大小,也就是5個整型的大小。這樣的話p就指向這個數組5本身所在地址的後一個地址了。由於p是指向整型的,所以p-1的這個1是1個int的大小, 所以,p-1就回到了5所在的地址了。所以第三個就是5了

如果p的值成爲這樣,那麼p指向哪裏?

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

結果是p指向a[1]的地址

這裏涉及一個強制轉換的概念, a原本指向的類型是int[5] , 上面的在括號i里加1就直接跳躍5*sizeof(int)個地址。
這裏先進行了強制轉換,現在a指向的類型是int ,加1就跳躍sizeof(int)個地址,就是a[1]所在的位置

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