在学习C Primer Plus中,发现:
第十章使用的大部分是二维数组的指针这种形式,即
int (* pz) [2];
第十一章出现了指针的数组形式,即
const char *mytal[LIM];
于是我有点懵逼了,到底这俩货是什么意思,可以互相代替吗?下面自己举例子试试看。
比如我想表示一个二维数组,{{1,2,3},{4,5,6},{7,8,9},{10,11,12}},三行四列,用两种方式试试看。
/* 二维数组的指针 与 指针的数组 */ #include <stdio.h> int main(void) { int i,j; int zippo[4][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; int (*pa)[3]; //二维数组的指针 int *pb[4]; //指针的数组(4个指针构成的一个数组,每个指针指向一个int型) pa = zippo; // pb = zippo; //表达式必须是可修改的左值?说明pb是常量,pb是一个数组名,代表了首元素pb[0](一个指针变量)地址:&(pb[0]) //这是一个常量,说明了在C语言中,声明一个变量的同时也给他分配了固定的地址! pb[0] = zippo[0];//pb[0]是一个指针变量,存放的地址是地址&zippo[0][0] pb[1] = zippo[1];//pb[1]是一个指针变量,存放的地址是地址&zippo[1][0] pb[2] = zippo[2];//pb[2]是一个指针变量,存放的地址是地址&zippo[2][0] pb[3] = zippo[3];//pb[3]是一个指针变量,存放的地址是地址&zippo[3][0] printf("pa: "); for(i=0; i<4; i++) { for(j=0; j<3; j++) printf("%-3d",pa[i][j]); printf(" "); } printf(" pb: "); for(i=0; i<4; i++) { for(j=0; j<3; j++) printf("%-3d",*(pb[i]+j)); printf(" "); } }
所以,两种使用指针的方式去表示二维数组:
1.使用二维数组的指针,需要知道每个元素数组中的元素个数,当然元素数组的个数不用说明,留给指针自己控制。例如:
int (*pa)[3];
pa = zippo;
2.使用指针数组,需要知道元素数组(即指针)的个数,当然每个元素数组中的元素的个数不需要说明,留给每个指针自己控制。而且赋值时需要分别对每个指针元素赋值。例如:
int *pb[4]; //指针的数组(4个指针构成的一个数组,每个指针指向一个int型)
pb[0] = zippo[0];//pb[0]是一个指针变量,存放的地址是地址&zippo[0][0]
pb[1] = zippo[1];//pb[1]是一个指针变量,存放的地址是地址&zippo[1][0]
pb[2] = zippo[2];//pb[2]是一个指针变量,存放的地址是地址&zippo[2][0]
pb[3] = zippo[3];//pb[3]是一个指针变量,存放的地址是地址&zippo[3][0]