關於「指針數組」和」數組指針「

  我一直弄不清楚」指針數組「和」數組指針「的區別,最近這段時間看到了一些關於數組和指針的關聯和區別的資料,而後總結了下這兩個概念的區別,以備後續查看。編程

一、區分指針數組和數組指針數組

  short *ptr[10];   //指針數組,可理解爲:存放指針數組spa

  short (*ptr1)[10];  //數組指針,可理解爲:指向數組指針指針

  ptr爲指針數組,能夠這麼看(short *) ptr[10],即ptr首先是長度爲10的數組,其類型爲(short *)型,或者說該數組的元素類型是指針類型;內存

  ptr1是數組指針,能夠這麼看(short [10]) *ptr1,即ptr1首先是指針,該指針指向的是長度爲10的shor型數組,或者說該指針存儲的是長度爲10的short型數組的地址,能夠以下初始化ptr1:引用

  short a[10];方法

  ptr1 = &a;總結

 

二、sizeof與指針數組、數組指針時間

(1)short *p1[100];  co

   sizeof(p1) = 400;

   sizeof(p1[0]) = 4;

   sizeof(*p1) = 4;

   sizeof(*p1[0]) = 2;

分析:這裏p1爲指針數組,根據上述分析p1的元素類型是short *

   sizeof(p1[0]) = sizeof(*p1) = 4(注:任意指針的sizeof大小均爲4);

   *p1[0] 爲short型,sizeof(*p1[0]) = sizeof(short) = 2 ;

   故,sizeof(p1) = 100 *sizeof(short *) =100 *  4 = 400;

(2)short (*p2)[100];

  sizeof(p2) = 4;

  sizeof(p2[0]) = 200;

  sizeof(*p2[0]) = 2;

  sizeof(*p2) =  4;

分析:p2是數組指針,根據上面的分析p2爲指針,至關於以下定義:short p2[][100];

   因此,sizeof(p2) = 4,sizeof(*p2) =  4;

   p2[0] = short [100],sizeof(p2[0]) = 100 * sizeof(short) = 100 * 2 =200;

   *p2[0] = p2[0][0],因此有:sizeof(*p2[0]) = sizeof(short) = 2;

(3)short (*p3[5])[3];

  sizeof(p3) = 20;

  sizeof(p3[0]) = 4;

  sizeof(*p3) =  4;

  sizeof(*p3[0]) = 6;

  sizeof((*p3[0])[0]) = 2;

分析:關於聲明從名字開始讀,而後按照優先級順序讀取(詳細方法見《C專家編程》第三章P65)

   這裏p3是指針數組,該數組有5個元素,每一個元素都是一個指針,每一個指針都指向一個含有3個元素的數組;

   因此,sizeof(p3) =  5 * sizeof(short *) =  5 * 4 = 20;

   p3[0]仍然是指針,指向數組short [3],sizeof(p3[0]) = sizeof(short *) = 4;sizeof(*p3) =  4;

   *p3[0] 至關於指針p3[0]的解引用,指向第一個數組的起始地址,因此sizeof(*p3[0])至關於求第一個數組的內存大小:sizeof(*p3[0]) = sizeof(short [3]) = 3 * sizeof(short) = 6;

   (*p3[0])[0] 至關於數組的第一個元素,至關於*p[0][0]因此sizeof((*p3[0])[0]) = sizeof(short) =2;注意:p3[0][0]也是一個指針,指向數組的第一個元素。sizeof(p3[0][0]) = 6;

相關文章
相關標籤/搜索