| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 807 人关注过本帖
标题:二维数组名的奇特现象!
收藏  订阅  推荐  打印 
way3
Rank: 2
来自:湖南
等级:注册会员
帖子:83
积分:1106
注册:2007-12-8
二维数组名的奇特现象!

最近我温习了一下指针,发现了一些奇特的现象,请各人达人赐教,偶感激涕零!
#include "stdio.h"
main()
{
    
     int b[2][3]={2,6,5,4,7,8};

     printf("\n%d\t%d\t%d\n",b,b[0],&b[0][0]); /* 二维数组名是从二维数组中第一行(一维数组)的首地址是二维数*/                                                 /*   组中的第一个元素的首地址 */

     printf("\n%d\t%d\t%d\n",*b,*b[0],b[0][0]);   /* 这里第一个输出不同,后面两个相同.为什么?*/
    
     printf("\n%d\t%d\t%d\n",b,*b,&b);        /*更绝的是这一行的输出,全部相同.*/
    
     printf("\n%d\t%d\n",b+1,&b+1);       /* 这两个数输出为什么不相同.为什么又和下面一行输出效果一样,*/
                                          /* 请问达人为什么?  */
     printf("\n%d\t%d\n",*(b+1),*(&b+1));   /*和上面一行输出完全一样*/

}

下面是在两个不同的编译器中运行的结果,只有一些地址不同,但本质上是一样的.其余相同.

[[italic] 本帖最后由 way3 于 2008-1-13 15:49 编辑 [/italic]]
附件: 只有本站会员才能下载或查看附件,请您 登录注册
搜索更多相关主题的帖子: 奇特现象  printf  col  main  
2008-1-13 14:53
岳C

等级:禁止发言
帖子:354
积分:3722
注册:2007-7-16
提示: 作者被禁止或删除 内容自动屏蔽

坚持到底
2008-1-13 15:12
岳C

等级:禁止发言
帖子:354
积分:3722
注册:2007-7-16
提示: 作者被禁止或删除 内容自动屏蔽

坚持到底
2008-1-13 15:13
随心
Rank: 12Rank: 12Rank: 12
来自:坐得屁股疼
等级:版主
威望:8
帖子:2259
积分:22988
注册:2007-8-12

今天在群里看了几个问题,发现大部分人都是基础不牢,一个很简单的问题也不能很快地看出来。这里面有在校大学生,也有是自学的,总之这是一个很普遍的现象。我也不例外。
二维数组那里就是一个很好的例子:
char c[10][20];
int j = 0;
char ch;
ch = getchar();
c[j] = ch;  //error!
像上面这样就是一个很典型的错误。
在C++里,一个二维数组可以看成是元素是一维数组的一个数组。像上面的:c[j],它只能表示其中(二维数组中)一个元素的起始地址。也就是说c[j]只是一个指针!
现在可以解释上面的错误了:把一个字符赋值给一个指针,当然是错的了。
现在回过头来想一下我的入门级的书里讲到的二维数组元素的访问方法,还是以上面的为例。要访问一个“元素中的元素”可以这样做:*(c[j]+i);。由于m[j] = *(m+j);,所以也可以写为*(*(c+j)+i);
关键在于理解

看国足,品三鹿, yeah~~~
2008-1-13 15:15
way3
Rank: 2
来自:湖南
等级:注册会员
帖子:83
积分:1106
注册:2007-12-8
回复 3# 的帖子

那是地址的不一样,其本质还是一样的.谢谢
2008-1-13 15:39
nobush
Rank: 2
等级:注册会员
帖子:71
积分:838
注册:2008-1-10

其實你的程序中第一行註解已經解答後面的問題
用數學描述就是b=*b=b[0]=&b[0][0]
2008-1-13 18:07
龙=虾
Rank: 1
等级:新手上路
帖子:19
积分:310
注册:2007-12-26
回复 1# 的帖子

实际上C当中 数组名是一个地址常量,
在数值上来说 &b=b=*b=b[0]=&b[0][0]
但是意义上是不一样的.
第一行输出 b是整个数组起始地址, b[0]二维数组首行起始地址, &b[0][0]是数组第一个元素地址
第二行输出 *b等效 *(b+0) 等效 b[0] ,见上行中间数据. 后面两个都是第一个元素的值*b[0] 等
           效 *(*(b+0)) , b[0][0] 等效  *(*(b+0)+0) 这两个结果是一样.
第三行输出 见上面第二句.
第四行输出 b+1 是数组下一行的地址 所以等于 首地址+3*4 (每行3个数据,每数据4字节)
                      &b+1 是相对数组这块内存的下一块, 等于 首地址+6*4(总共6个数据,同上)
第五行输出 *(b+1)  还是数组下行数组地址,等效 b+1(见第二句) , *(&b+1) 意思为下一个二维
           数组首地址(可理解为三维数组,请自己做实验).
2008-1-13 19:42
way3
Rank: 2
来自:湖南
等级:注册会员
帖子:83
积分:1106
注册:2007-12-8

谢谢龙虾,多谢大家!
2008-1-13 20:44
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.049900 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved