先简单说一下两个的概念,
指针数组:是一个数组,数组中的每个元素都是指针,例如 char *p[3];
数组指针:是一个指针,指向数组,例如 int (*q)[3];
测试代码:
#include <stdio.h>
int main()
{
int i=0;
char a=12,b=34,c=56;
char *p[3]={&a,&b,&c}; //指针数组
char y[]={1,2,3,4,5};
char (*q)[5]=&y; //数组指针
int z[]={6,7,8,9,10};
int (*r)[5]=&z; //数组指针
for(i=0;i<3;i++)
printf("p[%d]=%d, ",i,*p[i]);
printf("p=%p,p+1=%prn",p,p+1);
printf("sizeof(p)=%ldrn",sizeof(p));
printf("rnrn");
for(i=0;i<5;i++)
printf("y[%d]=%d, ",i,*(*q+i));
printf("q=%p,q+1=%prn",q,q+1);
printf("sizeof(q)=%ldrn",sizeof(q));
printf("rnrn");
for(i=0;i<5;i++)
printf("z[%d]=%d, ",i,*(*r+i));
printf("r=%p,r+1=%prn",r,r+1);
printf("sizeof(r)=%ldrn",sizeof(r));
printf("rnrn");
return 0;
}
在64位windows下运行结果如下:
p[0]=12, p[1]=34, p[2]=56, p=0x7ffc08409000,p+1=0x7ffc08409008
sizeof(p)=24
y[0]=1, y[1]=2, y[2]=3, y[3]=4, y[4]=5, q=0x7ffc08409023,q+1=0x7ffc08409028
sizeof(q)=8
z[0]=6, z[1]=7, z[2]=8, z[3]=9, z[4]=10, r=0x7ffc08408fe0,r+1=0x7ffc08408ff4
sizeof(r)=8
通过获取各个指针的大小可以发现,windows指针大小占用8个字节,p是指针数组,且有三个元素,所以占用大小是3*8=24个字节;q和r分别是char和int类型的数组的指针,所以都只占用8个字节。
所以,指针数组是某一类指针的合集,是一个数组;
数组指针仅仅是一个指针,指向数组。
阅读全文