1. 指针数组
定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位机器上,步长通常是4个字节;
int a[3][4];
int *p[3]; // 指针数组,具有3个类型为(int*)的元素;
p[0] = a[0]; // 将第一个元素的值赋值为a[0];
p[1] = a[1]; // 将第二个元素的值赋值为a[1];
p[2] = a[2]; // 将第三个元素的值赋值为a
2. 数组指针:
定义:int (*p)[n],由于()的优先级高于[],p和()结合成一个指针,指向一个具有n个int类型元素的数组,由于指针指向的是一个数组,p+1的步长是sizeof(int)*n,因此数组指针又可以称为行指针,在2维数组中,其步长是一行元素的总长度;
int a[3][4];
int (*p)[4] = a; // 数组指针,指向一个具有4个元素的一维数组,现在p的指向的地址和a的首地址一样;
p++; // 步长为sizeof(int) * 4,指向二维数组的下一行的地址,即&a[1];
例子:
int a[][] = {
{ , , },
{ , , },
{ , , }
};
int b[] = { , , , }; int (*pa)[] = a;
int (*pb)[] = &b;
int *pc = b;
int *pd[];
pd[] = a[];
pd[] = a[];
pd[] = b;
int **pe = (int**)(new char[sizeof(int*) * ]);
pe[] = a[];
pe[] = a[];
*(pe + ) = a[];
打印:
printf("pa %p %p \n", *pa, *(pa + ));
printf("pa %d %d %d \n", **pa, **(pa + ), *(*(pa + ) + ));
printf("pb %p %p \n", *pb, *(pb + ));
printf("pb %d %d \n", **pb, **(pb + ));
printf("pc %p %p \n", pc, pc + );
printf("pc %d %d \n", *pc, *(pc + ));
printf("pd %p %p %p %p \n", pd[], pd[], *(pd + ), *(pd + ) + );
printf("pd %d %d %d %d \n", *pd[], *(pd[] + ), **(pd + ), *(*(pd + ) + ));
printf("pe %p %p %p \n", pe[], pe[], *(pe + ));
printf("pe %d %d %d \n", *pe[], *(pe[] + ), *(*(pe + ) + )); pa 0x7fff5fbff7e0 0x7fff5fbff7ec
pa
pb 0x7fff5fbff7d0 0x7fff5fbff7e0
pb
pc 0x7fff5fbff7d0 0x7fff5fbff7d4
pc
pd 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7d0 0x7fff5fbff7d4
pd
pe 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7f8
pe