我一直弄不清楚”指针数组“和”数组指针“的区别,最近这段时间看到了一些关于数组和指针的关联和区别的资料,而后总结了下这两个概念的区别,以备后续查看。编程
一、区分指针数组和数组指针数组
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;