4.c语言中二维数组的指针如何表示二维数组和指针⑴ 用指针表示二维数组元素 。
要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题 。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素 。
当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了 。而每个大数组元素对应原来二维数组中的一行,称为行数组元素,显然每个行数组元素都是一个一维数组 。
下面讨论二维数组元素和指针之间的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了 。设p是指向二维数组a[M][N]的指针变量,若有:p=a[0]; 则p+j将指向a[0]数组中的元素a[0][j] 。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:p+i*N+j用"*"运算符表示为:*( p+i*N+j)同样,a[i][j]也可使用指针下标法表示,如下:p[i*N+j]例如,有如下定义:int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};则数组a有3个元素,分别为a[0]、a[1]、a[2] 。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3] 。
若有:int *p=a[0];则数组a的元素a[1][2]对应的指针为:p+1*4+2元素a[1][2]也就可以表示为:*( p+1*4+2)用下标表示法,a[1][2]表示为:p[1*4+2]特别说明:对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同 。a[0]是一维数组的名字,它指向的是一维数组a[0]的首元素a[0][0],对其进行“*”运算,得到的是一维数组元素a[0][0]的值,即*a[0]与a[0][0]是同一个值 。
而a是一个二维数组的名字,它指向的是二维数组a的首元素a[0],对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值 。它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i] 。
当用int *p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的 。这一点请务必注意 。
示例:#include int main(){ int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p=a[0],max,i,j,row,col; max=a[0][0]; row=col=0;for(i=0;i<3;i++) for(j=0;j<4;j++) if(*(p+i*4+j)>max) { max=*(p+i*4+j); row=i; col=j; } printf("a[%d][%d]=%d\n",row,col,max); printf("address of a is:%x\n", (unsigned int)a); printf("address of a[0] is:%x\n", (unsigned int)a[0]); printf("address of a[0][0] is:%x\n\n", (unsigned int)&a[0][0]); printf("address of (a+1) is:%x\n", (unsigned int)(a+1)); printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1)); printf("address of (a[0][0]+1) is:%x\n", (unsigned int)(&a[0][0]+1)); return 0;}运行结果:a[2][1]=88address of a is:bfdc0368address of a[0] is:bfdc0368address of a[0][0] is:bfdc0368address of (a+1) is:bfdc0378address of (a[0]+1) is:bfdc036caddress of (a[0][0]+1) is:bfdc036c从结果看出,a,a[0],a[0][0]是同一个地址,⑵ 用二维数组名作地址表示数组元素 。另外,由上述说明,还可以得到二维数组元素的一种表示方法:对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推 。
因此,*a与a[0]等价、*(a+1)与a[1]等价、*(a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向 。由此,对于数组元素a[i][j],用数组名a的表示形式为:*(*(a+i)+j)指向该元素的指针为:*(a+i)+j数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同 。
指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组 。示例:求二维数组元素的最大值 。
- 怎样扫描二维码 手机浏览器怎样扫描二维码
- 矩阵制组织结构又称规划目标结构是一种二维组织结构
- 微信改微信号 微信改微信号二维码会变吗
- 输入三个字符串,按从小到大的顺序输出指针
- qq怎么发红包 QQ怎么发红包二维码
- 怎样扫描二维码 怎样扫描自己手机上的二维码图片
- 传数组_iow第三个参数怎么写
- 九天玄数的数组怎么写
- cad二维轮廓线vba怎么写
- php数组数据库怎么写