指针变量可以指向一维数组,也可以指向二维数组,下面介绍二维数组的指针及指向二维数组的指针变量的一些基本概念和使用方法。
1.二维数组的指针与地址
二维数组的指针就是二维数组的地址。
假定有一个二维数组如下:
该数组有3行,每一行有4列,一共有12个元素。
如果假定: a[0][4]={1,2,3,4},a[1][4]={5,6,7,8},a[2][4]={9,10,11,12},那么,a数组可以写成a[3][4]={a[0][4],a[1][4],a[2][4]},这是一个一维数组。可以这样理解:a数组中有3个元素a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组。
还可以这样理解:
如果将二维数组中每一行看成一个广义上的元素,那么,二维数组就是一个特殊的一维数组。
C语言允许将二维数组当成一个特殊的一维数组来处理。
结合前面所学的知识,显然知道:对于二维数组a[3][4]而言,a是数组名,代表该数组的首地址,也就是元素a[0]的地址。即a等于&a[0],*a等于a[0]。另外,还可以推算出a+1等于&a[1],*(a+1)等于a[1],a+2等于&a[2],*(a+2)等于a[2]。从这里可以看出:二维数组名是一个指针,而且是一个行指针。
同样,a[0]、a[1]、a[2]分别是一维数组名,代表本数组的地址值,即a[0]等于&a[0][0],*a[0]等于a[0][0]; a[1]等于&a[1][0],*a[1]等于a[1][0] ;a[2]等于&a[2][0],*a[2]等于a[2][0]。
综合上面的叙述,可以得出下面结论:
①a等于&a[0],*a等于a[0],*a等于&a[0][0],**a等于a[0][0]。
②a+1等于&a[1],*(a+1)等于a[1],*(a+1)等于&a[1][0],*(*(a+1))等于a[1][0]。
③a+2等于&a[2],*(a+2)等于a[2],*(a+2)等于&a[2][0],*(*(a+2))等于a[2][0]。
④a+i等于&a[i],*(a+i)等于a[i],*(a+i)等于&a[i][0],*(*(a+i))等于a[i][0]。
⑤*(a+i)+1等于&a[i][1],*(a+i)+j等于&a[i][j],*(*(a+i)+j)等于a[i][j]。
注意:
二维数组中的元素a[i][j]相对于元素a[0][0]的位置为:i*m+j,其中m为该数组的列数。例如:在数组a[3][4]中,元素a[2][3]相对于a[0][0]的位置为2*4+3,即11。
2.指向二维数组的指针变量
C语言程序中,一个指针变量可以指向二维数组的某一行(指向一维数组),也可以指向二维数组中的某一个元素(指向具体数据)。
如果一个指针变量指向二维数组中的某一个元素,该二维数组可以通过元素相对地址的转换计算,用一维数组的方法来处理。
例7.9 用指向某一元素的指针变量输出二维数组中的元素值。
程序如下:
程序运行结果如下:
程序中,p是一个指向基本整型数据的指针变量,数组a是二维数组,3行4列,共有12个元素,语句p=&a[0][0];是将数组元素a[0][0]的地址赋给p,p指向数组元素a[0][0]。数组元素a[i][j]相对a[0][0]的地址为i*4+j,因此,数组元素a[i][j]的绝对地址就是p+i*4+j。语句printf("a[%d][%d]=%d",i,j,*(p+i*4+j));输出的是数组元素a[i][j]的值。
例7.10 用指向二维数组某一行的指针变量输出二维数组中的元素值。
程序如下:
程序运行结果如下:
注意:
①程序中“(*p)[4]”表示p为指针变量,它指向的对象是包含4个元素的一维数组。语句p=a;表示指针变量p指向数组元素a[0][],a[0][]表示数组a的第一行(含4个元素的一维数组),所以,*p代表数组名a[0],*p+j等于&a[0][j],*(p+i)等于&a[i][0];*(p+i)+j等于&a[i][j],*(*(p+i)+j)等于a[i][j]。
②定义指向一维数组的指针变量的一般方法为:
类型说明符 (*指针变量名)[元素个数];
例如:
例7.11 一个班有3个学生,各学4门功课,计算其平均分及第n个学生的成绩。
程序如下:
运行结果如下:
输入所有学生的成绩:
程序中,函数ave用来计算全班成绩平均分,其形参p指向一个float型数据,p+1表示指向下一个元素。函数ser用来输出某个学生的平均成绩,其形参p指向一个数据元素为float型的一维数组,p+1表示指向下一个一维数组,即指向下一行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。