二、二维数组指针定义、初始化
1、二维数组指针的定义、初始化
在上面的说明中我们已经知道,二维数组名是指向行的,它不能对如下说明的指针变量p直接赋值:
int a[3][4]={{10,11,12,13},{20,21,22,23},{30,31,32,33}},*p;
其原因就是p与a的对象性质不同,或者说二者不是同一级指针。C语言可以通过定义数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。
二维数组指针变量说明的一般形式为:
数据类型 (*指针变量名)[二维数组列数];
其中“类型说明符”为所指数组的数据类型
“ * ”表示其后的变量是指针类型
如果将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
总结:
数组指针:
定义一个指针变量,让这个指针变量指向一维数组的元素
二维数组指针:
行指针,用来指向二维数组的每一行,存放的是行的首地址
定义格式:数据类型 (*行指针变量名)[数组第二维的长度];
用二维数组指针来实现变量二维数组
打印如下
就像前面所说,随便定义一个指针变量p,它的等级和二维数组名的等级不在一个级别所以我们定义了二维数组指针q,这样这个指针q的等级就和二维数组等级是同级别,这样就可以把q和二维数组名a等效的用,所以在上面的程序中只要把a换成p就可以了。
总结:只要指针变量p(假设一个变量)和数组a的等级相同,那么p就可以取代a.但是a不能想p想怎么用就怎么用。
比如:p++这是正确的
a++这是错误的
三、指针数组和二维数组指针的区别
1、指针数组和二维数组指针变量的区别
int *p[3]={&a,&b,&c}; //p是一个指针数组
int (*p)[3]; //二维数组指针
区别:
这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。
二维数组指针变量是单个的变量,其一般形式中“(*指针变量名)”两边的括号是不可少的。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中“ *指针数组名”两边不能有括号。
例如:
int (*p)[3];
表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3
int *p[3];
表示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
|
|