1.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
因此,*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数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。
指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。示例:求二维数组元素的最大值。
该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。
main() { int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}}; int *p,max; for(p=a[0],max=*p;pmax) max=*p; printf("MAX=%d/n",max); } 执行结果:MAX=88 这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max=*p将数组的首元素值a[0][0]作为最大值初值;p指针的变化范围限制在12个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。示例:求二维数组元素的最大值,并确定最大值元素所在的行和列。
本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。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); } 程序运行结果:a[2][1]=88 ⑶ 行数组指针 对于指针,不管有多复杂,按照以下原则进行分析:从变量名处起,根据运算符优先级结合,一步一步分析。
在上面的说明中已经知道,二维数组名是指向行的,它不能对如下说明的指针变。
2.二维指针数组
a[i]从形式上看是a数组中的第i个元素。如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元的内容。a[i]是有物理地址的,是占内存单元的。但如果a是二维数组,则a[i]是代表一维数组名。它只是一个地址(如同一维数组名只是一个指针常量一样。) a,a+i,a[i],*(a+i),*(a+i)+j,a[i]+j都是地址。 *(a[i]+j)和*(*(a+i)+j)是二维数组元素a[i][j]的值。
举例说明一下:
int a[3][4]={…………};
a,*a; 第0行首地址和0行0列元素地址
a[0],*(a+0); 第0行0列元素地址
&a[0],&a[0][0];第0行元素首地址和0行0列元素地址
a[1],a+1; 第1行0列元素地址和1行首地址
&a[1][0],*(a+1)+0; 1列0行元素地址
a[2],*(a+2);2行0列元素地址
&a[2],a+2;第2行元素首地址
a[1][0],*(*(a+1)+0);第1行0列元素的值希望楼主采纳
3.怎么让一个二维指针指向一个二维数组
楼主,我想讲讲二级指针的原理,它是指向内存地址的地址,简单说就是取两次地址,一维数组,二维数组它们的元素都对应拥有一个暂时分配的内存地址,就是说只需要一个一级指针就可以完成取址,如果你用一个二级指针去取址是会取到乱值,如果是系统的地址系统就会崩溃(我就是试过用指针把编译器搞崩溃了),我下面例子说明一下:
一级指针取址:
char a[10];
char *p;
p=a/*将a[10]首地址赋值给一级指针*/
scanf("%s",p)/*编译系统会移动自动指针*/
char a[10][10];
char *p;
p=a[0]/*将a[10][10]首地址赋值给一级指针*/
scanf("%s",p)/*编译系统会移动自动指针*/
二级指针:
char *a[]={"12","34","56"};/*定义一个指针数组*/
char **p;/*二级指针*/
p=a;
printf("%s",*p);/*输出12*/
这里我解释一下,定义一个指针数组,就是数组里面又有地址,你仔细看看,数组有地址,指针数组里面的字符串如("12")也是有地址的,这样就需要用一个二级指针指向它了,就是二级寻址,这是*p就不再是元素,就变成字符串"12"的首地址,由于系统自动移动指针,所以就输出12
呵呵,如果你明白,那么三级指针也是同样道理,定义一个指向指针的指针数组,用一个
三级指针实现三级寻址,就是找三次地址,这里我就不举例了,怕你不明白了,呵呵……你现在明白了吗?
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
因此,*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数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。
指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。示例:求二维数组元素的最大值。
该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。
main(){int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};int *p,max;for(p=a[0],max=*p;pmax) max=*p;printf("MAX=%d/n",max);}执行结果:MAX=88这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max=*p将数组的首元素值a[0][0]作为最大值初值;pmax) { max=*(p+i*4+j); row=i; col=j; }printf("a[%d][%d]=%d/n",row,col,max);}程序运行结果:a[2][1]=88⑶ 行数组指针对于指针,不管有多复杂,按照以下原则进行分析:从变量名处起,根据运算符优。
5.如何遍历二维指针数组
只要写个双重循环就可以实现,n维数据就可以用n重循环来实现。举一个2维的例子,可以借鉴一下,例如
int line =0;
int a[2][2] = {1,2,3,4};
for (int i = 0; i<2 ;++i)
{
for (int j = 0; j<2 ;++j)
{
cout << a[i][j] << ' ';
line++;
}
cout << endl;
}