二维指针数组怎么写( 二 )


该问题只需对数组元素遍历,即可求解 。因此,可以通过顺序移动数组指针的方法实现 。
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
呵呵,如果你明白,那么三级指针也是同样道理,定义一个指向指针的指针数组,用一个
三级指针实现三级寻址,就是找三次地址,这里我就不举例了,怕你不明白了,呵呵……你现在明白了吗?