请大家帮帮忙,问一个C语言问题,谢了,为什么要两次对*p赋初地址呢?我删掉任何一个,运行都是错误的。

来源:百度知道 编辑:UC知道 时间:2024/06/16 16:37:47
/*lt6_4.c*/
#include <stdio.h>
#define M 2
#define N 5
main()
{
int a[M][N], max, i, j;
int *p=&a[0][0]; /*第一次赋初值*/
printf("请输入数组中各元素的值:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",p++);
*p=&a[0][0];/*第二次赋初值*/
max=a[0][0]; /*首先认为第一元素的值是最大值
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(max<*(p+i*N+j)) /*max与各数组元素进行比较*/
max=*(p+i*N+j); /*max总是存放比较后的大者*/
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%5d",*(p+i*N+j)); /*逐行输出数组元素*/
printf("\n");
}
printf("数组中的最大值为:%d",max); /*输出最大值*/
}

第一次赋初值让指针p获得数组a的首地址。
然后你有对p执行加的操作
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",p++); //这里!!
所以如此操作后,p不是指向原来a的首地址了。所以第二次
*p=&a[0][0];是把p的值重新设置为数组a的首地址。
明白了么?

同意楼上的回答很好
改这一句:
*p=&a[0][0];/*第二次赋初值*/ 改成
p=&a[0][0];//赋值错误

第一个p=&a[0][0];是赋初值了。

for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",p++);
在上面语句之后,p已经指向a[M][N]后面一个元素地址了,第二个p=&a[0][0];后,才能把p指向a[0][0]了。

第二次p不是指向原来a的首地址了.要初始化