首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请教这两段c代码的区别.为什么

2012-12-28 
请问这两段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](最后一个地址) 这样最后一个数就输不出来了  上面的可以
[其他解释]

引用:
引用:引用:引用:有区别的。p < &amp;amp;amp;amp;a[3][3]比p <= &amp;amp;amp;amp;a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3][2],你也应该能看出来,数组已经越界了,所以后面三个输出的值……


这个问题,我还真没考虑过。我刚看了一下,这是我自己的理解,不知道是否正确。首先这个是一个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楼错误
[其他解释]
啊.你说的我有点迷糊了
[其他解释]
引用:
&amp;a[N-1][N-1](最后一个地址)  1楼错误

啊 你说的我有点迷糊了
[其他解释]
引用:
引用:&amp;amp;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]根本就不存在
[其他解释]
引用:
a[N-1][N-1]后面还有a[N][0],a[N][1],a[N][2]...一直到....a[N][N-1],a[N][N]
你说有区别


最多只能指向最后一个元素的下一个
[其他解释]
引用:
a[N-1][N-1]后面还有a[N][0],a[N][1],a[N][2]...一直到....a[N][N-1],a[N][N]
你说有区别

这个才是正解

[其他解释]
 
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%以上!

[其他解释]

引用:
有区别的。p < &amp;a[3][3]比p <= &amp;a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3][2],你也应该能看出来,数组已经越界了,所以后面三个输出的值可能很随机

同学.我想知道的就是为什么会多出来这三个呢? 第一个a[3][0]不是已经不满足条件了么?
[其他解释]
记住数组的索引是从0开始的就行了
[其他解释]
引用:
引用:有区别的。p < &amp;amp;a[3][3]比p <= &amp;amp;a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3][2],你也应该能看出来,数组已经越界了,所以后面三个输出的值可能很随机
同学.我想知道的就是为什么会多出来这三个呢? 第一个a[3][0]不是已经不满足条件了么?
      ……


不是你想的那样,p<&a[3][3],在这里,&a[3][3],是取出来了a[3][3]的地址,那么从a[2][2]的地址到a[3][3]的地址,这中间还有三个地址,a[3][0],并不是根据二维数组中的索引值来判断的,是根据整体的地址来判断的
[其他解释]
引用:
引用:引用:有区别的。p < &amp;amp;amp;a[3][3]比p <= &amp;amp;amp;a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3][2],你也应该能看出来,数组已经越界了,所以后面三个输出的值可能很随机
同学.我想知道的就是为什么会多出来这三个……

不好意思哈.又来麻烦你了.我想知道a[2][2]到a[3][3]中间为什么是三个地址呢?不是隔着  a23 30 31 32四个地址么?还是说没有a23?
[其他解释]
引用:
引用:引用:引用:引用:有区别的。p < &amp;amp;amp;amp;amp;a[3][3]比p <= &amp;amp;amp;amp;amp;a[2][2]要多出三个元素,也就是a[3][0],a[3][1],a[3……

很有启发.谢谢啊.

热点排行