C语言指针问题,高手来,有分,真心看不懂啊!!!

#defineM5#defineN4voidmain(){inta[M][N],*p=a[0],i,j;printf("向二维数组赋值:、n");for(;p<a[0]+... #define M 5
#define N 4
void main()
{
int a[M][N],*p=a[0],i,j;
printf("向二维数组赋值:、n");
for(;p<a[0]+M*N;p++)
scanf("%d",p);
p=a[0];
printf("\n输出二维数值:n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%5d",p[i*N+j])};
printf("\n");
}
}

输入
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
输出
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20

应该是各5行4列的数组吧,为什么输入是4行5列呢? 还有p<a[0]+M*N是什么意思?帮我解析下这道题,数组看了一下午看的一知半解的,这是到例题,求大神帮助,谢谢。
展开
 我来答
DK小黑
2013-08-05 · TA获得超过339个赞
知道小有建树答主
回答量:96
采纳率:100%
帮助的人:82.7万
展开全部
(1)输入时只要以空格分隔20个数字就行了,分成几行无所谓;(2)因为数组名表示该数组首个元素的地址,而a[M][N]是二维数组,所以a[0]表示的是第一行的第一个元素的地址,再加上M*N(元素总个数),就是数组最后一个元素的下一个元素,即a[M-1][N]。因此,p<a[0]+M*N意思就是用来控制循环结束的条件(到数组最后一个元素就结束循环)。
更多追问追答
追问
a[0]+M*N还是不懂难道就是个乘法?a[0]+20? 那么是a[0][20]?P是a【0】【0】,然后每次+1,从p[0][1]一直加到p[0][20]结束,然后在赋值,p[0][0]? 下面p[i*N+j]呢?是[4乘以i][j]?
追答
(1)对数组下标的引用会被编译器解析为“指针+偏移量”,比如,array[3]等价于*(array+3),其中数组名array也是指向数组首个元素的指针。a[0]是指针(指向第一行数组的首个元素),于是对它可以进行“指针+偏移量”的运算。M*N就是提供个数值(偏移量),就是你说的a[0]+20;
(2)受二维数组行数与列数的限制,一般不写成a[0][20],而是表示成a[4][3]的下一个元素;
(3)对指针p赋值,使它从第一个元素一直到变到最后一个元素,然后再赋值成第一个元素;
(4)p[i*N+j]会被编译器解析成“指针+偏移量”运算,即*(p + i*N + j)。这是因为二维数组在内存中并非“二维”形式,而是按顺序排成一排,所以可以通过这种方式来引用数组的各元素的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuantailing
2013-08-05 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:635万
展开全部
的确应该是5行4列的数组,但输入格式怎样就不用管了,就算输入的那20个数全打在同一行,运行结果也是一样的。

因为int [M][N],所以a[0]地址开始存了M*N个数,a[0]+M*N就是第一个越界的地址,p必须小于它才有意义,否则越界了。
更多追问追答
追问
a[0]+M*N是什么意思啊?变成a[m][n]形式?我在书上看的一些变化形式没有这种的啊?
追答
a[0]的值等于&a[0][0]
a[0]+M*N的值等于&a[M][0]。
数组的最后一个元素地址应该是a[0]+M*N-1,即&a[M-1][N-1],&a[M][0]已经越界,p需要小于它。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
HOHD
2013-08-05 · TA获得超过132个赞
知道小有建树答主
回答量:219
采纳率:80%
帮助的人:46.5万
展开全部
建议你先了解指针吧!先把地址先打印出来(谭浩强的书上有!)通过这个来了解一下什么是指针,然后再搞数组吧!数组尤其是二维数组毕竟是通过指针组成的一个表吗!
追问
看的是谭浩强的吧,学校发的,主编是他,前面都看懂了就是指针访问二维数组这不懂,这是第一节的一道例题就是看不懂!
追答
main()
{
int i,b;

i=1,b=2;//英文不好,别笑我;你用的应该是vc6吧!

printf(”the address of i is :%x",&i);//建议初学者用TC学习,你用的应该是4版书的吧!

printf("the address of b is :%x",&b);//感觉还是3版的好

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式