前面学习了利用指针变量引用一维数组的方法,同样可以利用指针变量引用二维数组和多维数组,而且方式相同。下面主要介绍指向二维数组的指针。
(1)使用二维数组名作为指针访问数组元素。例如:
int a[3] [4] ={ {0,1,2,3}{4,5,6,7}{8,9,10,11}} ; //定义二维数组并初始化指针与二维数组的关系如图9-7所示。
说明:
图9-7 指针与二维数组的关系
首先,二维数组a可以看成是由a[0],a[1] ,a[2]这3个元素组成的一维数组,a是该一维数组名,代表该一维数组的首地址,即第一个元素a[0]的地址(&a[0] )。由一维数组与指针的关系可知,表达式a+1表示首地址所指元素后面的第一个元素的地址,即表示元素a[1]的地址(&a[ 1]),同理,a +2表示元素a[2]的地址(&a[2] )。可以通过地址的方式引用元素的值, * (a+0)表示*a或元素a[0], * (a+1)表示元素a[1] ,* (a +2)表示元素a[2]。注意:这里所谓的元素实际上仍然是个地址,而不是一般意义上的数据元素。
其次,a[0],a[1]和a[2]这3个元素分别可以视为是由4个整型元素组成的一维数组的数组名。a[0]可以看成是由a[0][0],a[0][1] ,a[0][2],a[0][3]组成的一维数组。因此,a[0]就是这个一维数组的数组名,是一个地址常量,表示该一维数组的首地址,即第一个元素a[0] [0]的首地址&a[0][0],表达式a[0] +1表示下一个元素a[0][1]的地址&a[0][1] ,表达式a[0] +2表示元素a[0][2]的地址&a[0] [2],表达式a[0] +3表示元素a[0][3]的地址&a[0][3]。因此, * (a[0] +0)表示元素a[0] [0] , * (a[0] + 1)表示元素a[0] [ 1 ] , * (a[0] +2)表示元素a[0] [2], * (a[0] +3)表示元素a[0][3]。
推广到一般情况:a[i]即* ( a + i)可以看成一维数组a的下标为i的元素,a[i]又可以看成是由a[i] [0] ,a[ i] [ 1 ] ,a[i] [2] ,a[i] [3]这4个元素组成的一维数组的数组名,代表该一维数组的首地址,即第一个元素a[i][0]的地址&a[i] [0];a[i] +j即* (a+i) +j表示该数组中下标为j的元素地址&a[i] [j]。 * (a[i] +j)即* ( * (a+ i) +j),就表示这个地址所指向的数组元素的值,即a[i] [j]。存在下面的等价形式:a[i] [j], * (a[i] +j),* ( * (a+i) +j),( * (a+i) )[j]。
如果将二维数组名a看成一个行地址(第0行的地址),则a+i表示二维数组a的第i行的地址。a[i]可以看成列地址,即第i行第0列的地址。行地址a每次加1,表示指向下一行;而列地址a[i]每次加1,表示指向下一列。因此,通过二维数组名a对其数组元素进行访问可以采用如下形式: * ( * (a+行号)+列号),它等价于a[行号][列号]。
例9.6 利用二维数组名作为指针输出二维数组的全部元素。
编写程序:
创建一个名为“eg9_6.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本程序使用数组名和元素所在行列值表示二维数组元素,即* ( * (a +i)+j)可以表示二维数组元素a[i][j],其中i表示行,j表示列。
(2)指向二维数组的指针变量。
指向二维数组的指针变量的定义的一般形式为:
说明:
1)指针变量名和*号一定要用小括号括起来。
2)常量表达式规定了指针所指一维数组的长度,也就是二维数组的第二维的大小,不能省略。
3)数据类型符表示指针所指一维数组的元素类型。
例如:
int a[3 ] [4] ={ {0,1 ,2,3 } , {4,5,6,7} , { 8,9,10,11}; //定义二维数组并初始化
int ( *p)[4] =a; //定义的指针变量p指向包含4个整型元素的一维数组a[0]
说明:
指针变量p指向了二维数组a[3] [4],这里p相当于一维数组,数组元素p[0],p[1],p[2]分别存放二维数组的各行首地址,因此指针变量与二维数组的对应关系如下:
* (p[0] +0), * ( *p+0*4+0)或* ( * (p +0) +0)表示a[0] [0] ;
* (p[0] +1), * ( *p+0*4+1)或* ( * (p+0) +1)表示a[0][1] ;
* (p[0] +2), * ( *p+0*4+2)或* ( * (p +0) +2)表示a[0][2];(www.daowen.com)
* (p[0] +3), * ( *p+0*4+3)或* ( * (p+0) +3)表示a[0][3];
* (p[1] +0), * ( *p+1 *4+0)或* ( * (p+1) +0)表示a[1][0];
……
* (p[2]+3)、* ( *p+2*4+3)或* ( * (p+2) +3)表示a[2][3]。
对于1个m行n列的二维数组a[m][n],如果将该二维数组的首地址赋值给指针变量p,则通过指针变量访问二维数组元素a[i] [j]的方式有* (p[i] +j), * ( *p+i*n+j)和* ( * (p+i) +j)这3种。
例9.7 利用指向二维数组的指针输出二维数组的全部元素。
编写程序:
创建一个名为“eg9_7.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本程序使用指向二维数组的指针变量和数组元素所在行列值表示二维数组元素,即* ( * (pt+i) +j)表示二维数组元素a[i][j],其中i表示行,j表示列,同样可以得到例9.6的结果。
(3)指针数组。指针数组是存储指针变量的数组。
指针数组定义的一般形式为:
说明:
1)指针数组名和*号不能用小括号括起来。
2)常量表达式规定一维数组的长度。
3)数据类型符表示数组元素(即指针变量)所指向的一维数组的元素类型。
例如:
int a[3 ] [4] ={ {0,1 ,2,3 }, {4,5,6,7} , {8,9,10,11}} ;//定义二维数组
int*pArray[3] ={a[0],a[1],a[2]}; //定义可存放3个整型指针的
//数组pArray,并初始化
例9.8 利用指针数组输出二维数组的全部元素。
编写程序:
创建一个名为“eg9_8.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本程序使用指针数组和数组元素所在行列值表示二维数组元素,即* ( * (pArray+i) +j)表示二维数组元素a[i] [j],其中i表示行,j表示列,同样可以得到例9.6 的结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。