请问这两段c代码的区别.为什么#include stdio.h#define N 3int main (void){int a[N][N]{{2,3,4},{2,4,
请问这两段c代码的区别.为什么
#include <stdio.h>
#define N 3
int main (void)
{
int a[N][N]={{2,3,4},{2,4,3},{4,3,6}};
int *p;
for (p=&a[0][0];p<=&a[N-1][N-1];p++)printf ("%d ",*p);
return 0;
}
#include <stdio.h>
#define N 3
int main (void)
{
int a[N][N]={{2,3,4},{2,4,3},{4,3,6}};
int *p;
for (p=&a[0][0];p<&a[N][N];p++)
printf ("%d ",*p);
return 0;
}
[最优解释]
由于数组是连续存储的 p首先指向第一个地址 p<&a[N][N](最后一个地址) 这样最后一个数就输不出来了 上面的可以
[其他解释]
这个问题,我还真没考虑过。我刚看了一下,这是我自己的理解,不知道是否正确。首先这个是一个3*3的二维数组,比如说a[0][2]的下一个地址,应该a[1][0],这是根据二维数组的长和类型定的,也就是a[0][2]加上3个int类型的地址就是a[1][0]。因此,那么a[2][2]的下一个地址也就是a[3][0],而a[2][3]这个地址是a[2][2]加上一个int地址得到的。
[其他解释]指针用不好想当危险
[其他解释]a[N-1][N-1]后面还有a[N][0],a[N][1],a[N][2]...一直到....a[N][N-1],a[N][N]
你说有区别
[其他解释]第一个是对的 第二个&a[N][N]根本不存在 越界了
[其他解释]&a[N-1][N-1](最后一个地址) 1楼错误
[其他解释]啊.你说的我有点迷糊了
[其他解释]啊 你说的我有点迷糊了
[其他解释]你定义的二维数组是a[3][3],它的最后一个元素是a[2][2]
[其他解释]p<=&a[N-1][N-1];p++相当于当P=&a[N-1][N-1]时,下一个是&a[N-1][N-3],&a[N-1][N-2],&a[N-1][N-1],
第二个就是下标越界了a[n]的上界就是a[n-1]
[其他解释]第二个越界了啊,a[3][3]根本就不存在
[其他解释]最多只能指向最后一个元素的下一个
[其他解释]这个才是正解
[其他解释]
for (p=&a[0][0];p<=&a[N-1][N-1];p++)
printf ("%d ",*p);
for (p=&a[0][0];p<&a[N][N];p++)
printf ("%d ",*p);
这两个 还是有区别的
后面地址 显然差了 3*int 位
[其他解释]
有区别的。p < &a[3][3]比p <= &a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3][2],你也应该能看出来,数组已经越界了,所以后面三个输出的值可能很随机
[其他解释]
“多一少一”问题占程序员常犯错误的10%以上!
[其他解释]
同学.我想知道的就是为什么会多出来这三个呢? 第一个a[3][0]不是已经不满足条件了么?
[其他解释]记住数组的索引是从0开始的就行了
[其他解释]不是你想的那样,p<&a[3][3],在这里,&a[3][3],是取出来了a[3][3]的地址,那么从a[2][2]的地址到a[3][3]的地址,这中间还有三个地址,a[3][0],并不是根据二维数组中的索引值来判断的,是根据整体的地址来判断的
[其他解释]不好意思哈.又来麻烦你了.我想知道a[2][2]到a[3][3]中间为什么是三个地址呢?不是隔着 a23 30 31 32四个地址么?还是说没有a23?
[其他解释]很有启发.谢谢啊.