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是什么意思?帮我解析下这道题,数组看了一下午看的一知半解的,这是到例题,求大神帮助,谢谢。 展开
#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是什么意思?帮我解析下这道题,数组看了一下午看的一知半解的,这是到例题,求大神帮助,谢谢。 展开
展开全部
(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)。这是因为二维数组在内存中并非“二维”形式,而是按顺序排成一排,所以可以通过这种方式来引用数组的各元素的值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
的确应该是5行4列的数组,但输入格式怎样就不用管了,就算输入的那20个数全打在同一行,运行结果也是一样的。
因为int [M][N],所以a[0]地址开始存了M*N个数,a[0]+M*N就是第一个越界的地址,p必须小于它才有意义,否则越界了。
因为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需要小于它。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议你先了解指针吧!先把地址先打印出来(谭浩强的书上有!)通过这个来了解一下什么是指针,然后再搞数组吧!数组尤其是二维数组毕竟是通过指针组成的一个表吗!
追问
看的是谭浩强的吧,学校发的,主编是他,前面都看懂了就是指针访问二维数组这不懂,这是第一节的一道例题就是看不懂!
追答
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版的好
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询