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