标题:二维数组名的奇特现象!
只看楼主
way3
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-12-8
 问题点数:0 回复次数:7 
二维数组名的奇特现象!
最近我温习了一下指针,发现了一些奇特的现象,请各人达人赐教,偶感激涕零!
#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]]

数组名1.jpg (6.49 KB)


数组名2.jpg (7.71 KB)
搜索更多相关主题的帖子: 奇特现象 printf col main 
2008-01-13 14:53
岳C
Rank: 1
等 级:禁止发言
帖 子:354
专家分:0
注 册:2007-7-16
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

坚持到底
2008-01-13 15:12
岳C
Rank: 1
等 级:禁止发言
帖 子:354
专家分:0
注 册:2007-7-16
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

坚持到底
2008-01-13 15:13
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
得分:0 
今天在群里看了几个问题,发现大部分人都是基础不牢,一个很简单的问题也不能很快地看出来。这里面有在校大学生,也有是自学的,总之这是一个很普遍的现象。我也不例外。
二维数组那里就是一个很好的例子:
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);
关键在于理解

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-01-13 15:15
way3
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-12-8
得分:0 
回复 3# 的帖子
那是地址的不一样,其本质还是一样的.谢谢
2008-01-13 15:39
nobush
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2008-1-10
得分:0 
其實你的程序中第一行註解已經解答後面的問題
用數學描述就是b=*b=b[0]=&b[0][0]
2008-01-13 18:07
龙=虾
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2007-12-26
得分:0 
回复 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-01-13 19:42
way3
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-12-8
得分:0 
谢谢龙虾,多谢大家!
2008-01-13 20:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-197325-1-1.html




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

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