| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1061 人关注过本帖
标题:这段代码为什么没有错啊!希望朋友们给解答下哈
只看楼主 加入收藏
cheenbee
Rank: 2
等 级:论坛游民
帖 子:53
专家分:32
注 册:2011-11-3
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:10 
这段代码为什么没有错啊!希望朋友们给解答下哈
#include<stdio.h>
void main(){
    int a[][3]={{1,2,3},{4,5,6}};
    int b[2][3];
    int i,j;
    for(i=0;i<6;i++)
        b[0][i]=a[0][i];
}
   看到的答案是这样的:   虽然元素b[0][i]和a[0][i]的第二维下标i的值可能超界(例如取值为3、4、5时),但从数组的存储结构可知,下标的变化仍然在所定义数组的元素范围内(可以认为1行6列),故该语句是正确的。


可小弟还是搞不明白这句话是什么意思,求解答啊!
搜索更多相关主题的帖子: 朋友 
2011-11-04 21:46
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:1 
首先你要知道数据在内存中的存储方式。a在内存中的存储是:[1][2][3][4][5][6],也就是一片连续空间,b数组也是一样,再想想
2011-11-04 21:49
非死亡!
Rank: 8Rank: 8
来 自:四川
等 级:蝙蝠侠
帖 子:179
专家分:760
注 册:2011-10-31
收藏
得分:1 
程序代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{  int *p;
   int a[][2]={{1,2},{3,4}};
   int i;
   p=&(a[0][4]); //地址
   *p=5;
   for(i=0;i<=4;i++)printf("%d",a[0][i]);

  
}
试试结果
程序代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{ 
   int a[][2]={{1,2},{3,4}};
   int i;
   (a[0][4])=5;
   for(i=0;i<=4;i++)printf("%d",a[0][i]);
  
}
明白了吧?

能力 技巧
2011-11-04 23:28
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:1 
数组的存储空间是连续的,数组a[][3]={{1,2,3},{4,5,6}},在内存中的空间如2楼所说的
空间内的空间为 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
分别对应的数据为  1        2       3      4        5       6,
当a[0][2]的列的标号超过2,为3的时候,就会向后移动一位,就是 a[1][0]的存储空间,
就是a[0][3]和a[1][0]是同一块空间,是相等的。
2011-11-05 00:14
Y_Jo_1
Rank: 4
等 级:业余侠客
帖 子:59
专家分:215
注 册:2011-10-20
收藏
得分:1 
a在内存中的存储是:[1][2][3][4][5][6],也就是一片连续空间,b数组也是一样,可以想象成一维数组
2011-11-05 09:19
kan月
Rank: 1
等 级:新手上路
帖 子:13
专家分:3
注 册:2011-9-28
收藏
得分:1 
程序代码:
#include "stdio.h"
void main()
{
   int *p;
   int a[][2]={{1,2},{3,4}};/*这里可以看成a[0][0]={1}
                                          a[0][1]={2}
                                          a[0][2]={3}
                              最后{4}是没有被分配存储
                              空间的。*/
   int i;                  
   p=&(a[0][3]); //这里这里从新初始化一个a[0][3]
   *p=5; //给a[0][3]赋值,a[0][3]={5}
   for(i=0;i<=4;i++)
   printf("%d\n",a[0][i]);
  
}
/*运行过后会出现1 2 3 5,还有一个固定的错误值。
  对比 非死亡 同学这程序:
  {  int *p;
   int a[][2]={{1,2},{3,4}};
   int i;
   p=&(a[0][4]); //地址
   *p=5;
   for(i=0;i<=4;i++)printf("%d",a[0][i]);


 
}
您看能不能明白点什么!

这个主要是要说明,有足够的存储单元就能赋予它多少值,

如果没有足够存储单元就会出现漏值,上面{4}就是被遗漏

的值,所以你提问的程序为什么是对的,因为它有足够存储

单元赋值。我也是新手!有错误还请指导。*\
2011-11-05 10:19
cheenbee
Rank: 2
等 级:论坛游民
帖 子:53
专家分:32
注 册:2011-11-3
收藏
得分:0 
一句感谢已不够!
   谢谢各位能及时解答小弟的各个疑问,虽然分不多而且也只是给一个人。
 我想和各位说:谢谢!非常的真诚,不怕各位笑话,一想到这动情处,总有想哭的冲动。
 感谢你们的无私解答,也请原谅小弟的难言之隐,作为新人,分少疑问多,何况有那么多无私地回答,
 小弟我无以为报,以身相许的事也不会想,所以就送上一份祝福,祝各位朋友身体健康生活顺心!!!
2011-11-05 10:47
zwhgudu1314
Rank: 1
等 级:新手上路
帖 子:22
专家分:7
注 册:2011-3-3
收藏
得分:1 
#include "stdio.h"
void main()
{
   int *p;
   int a[][2]={{1,2},{3,4}};/*这里可以看成a[0][0]={1}
                                          a[0][1]={2}
                                          a[0][2]={3}
                              最后{4}是没有被分配存储
                              空间的。*/
   int i;                  
   p=&(a[0][3]); //这里这里从新初始化一个a[0][3]
   *p=5; //给a[0][3]赋值,a[0][3]={5}
   for(i=0;i<4;i++)
   printf("%d\n",a[0][i]);
  
}
上面这个确实说错了。看一下a[0][3]的值。会是5.如果没赋值给它的话。4还是可以打印出来的。因为它空间有四个。容得下4.
2011-11-05 22:41
khaz
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:130
专家分:188
注 册:2011-4-21
收藏
得分:1 
A[N]的意思是取地址A的偏移量N,分配了6个连续的内存单元所以N=6是不会越界的。
如果你明白数据名是地址,并且明白a[0]是地址就好说多了
"hello"[4] = 'o'
如果你能明白这个是合法的就更不用说了
2011-11-06 00:21
我不是大虾
Rank: 2
等 级:论坛游民
帖 子:38
专家分:29
注 册:2011-10-26
收藏
得分:1 
楼上的hello不需要加双引号吧?
2011-11-06 01:19
快速回复:这段代码为什么没有错啊!希望朋友们给解答下哈
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020837 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved