C语言中指针引用二维数组元素问题

假设a是一个3行4列的二维数组,请问为什么a[0]与*(a+0)是等价的,我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就是... 假设a是一个3行4列的二维数组,请问为什么a[0]与*(a+0)是等价的,
我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)。
a[0]与*(a+0),一个元素地址和一个元素内容又如何能等价~~
请懂C语言的人帮忙解答,指出我的思维误区。我都为这问题冥思苦想好几天了,每次拿起书本就把该节内容看一边,就是不理解这了。
展开
 我来答
火之_尤迪安
2011-08-16 · TA获得超过122个赞
知道答主
回答量:115
采纳率:0%
帮助的人:115万
展开全部
(a+0)是地址没错
“*(a+0)”就是指向“(a+0)”这个地址的内容(即首个元素值)这句话也没错
因为a这个地址中放的也还是一个地址

======举个例子======
例如:
a[3][3] = { 1 , 2 , 3
4 , 5 , 6
7 , 8 , 9 };
1的地址就是a[0], (a[0]是a[0][0],a[0][1],a[0][2]中第一个数据a[0][0]的地址,下同理)
4的地址就是a[1],
7的地址就是a[2]。
然后你再把这个1、4、7组成的a[0],a[1],a[2]看做一个一维数组
那么a(也可以说是a+0)表示的就是第一个数a[0]的地址。
所以*(a+0)就是地址a中所存放的数值(即a[0]),只不过这个数值是个地址的编号罢了~ 因为地址也是一串数字啊~

你可以就用这个a[3][3]写段代码试试~ 输出 *( *(a+1) + 2 ) 看看是不是等于6~
beddy1
2011-08-15 · TA获得超过1989个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2253万
展开全部
这个问题我想我能回答你。且听我细说。
首先a是二维数组变量,不要乱说什么首地址,它不是。数组就是数组,它是区别于单个数据的一种类型,不要随便和它对应的单个数据类型随便做比较。
然后我们再说一点,C标准里面有说明,如int a[3][4],为了方便使用,a是可以隐式转换为int (*)[4]的。所以a+0的意思你就明白了,它得到的是int (*)[4]的指针,位置在哪不用我说了。解引用后就是int [4]了。 而a[0]的类型也是int [4]。所以它们是等价的。
有一点可以证明我的说法,请尝试*(a+1),它等于a[1],这足够说明很多人对数组的理解是错误的。

上面还有个说我在胡说,真是搞笑了,同志们,对数组理解的不透就别来误导别人了。如果a真的只是指向首地址的指针,那么请问,下面代码的输出是什么?
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
cout << (*(a + 1))[0] << endl;
随便找个翻译器试试吧,结果是5,而不是2。用你们的破理论讲的通么?如果用我的呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
杜茂彦rc
2011-08-15 · TA获得超过1144个赞
知道小有建树答主
回答量:1314
采纳率:100%
帮助的人:1255万
展开全部
任何指针, a[0] 就是 *(a+0)
a[i] 就是 *(a+i)
这是个恒等式,不用理解,或者说这就是编译器直接对[]的处理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
回首过客
2011-08-15
知道答主
回答量:45
采纳率:0%
帮助的人:30.1万
展开全部
简单
数组a[0]就是数组a[0][0],这时的a[0]表示的是一个值;
*(a+0)表示读取数组首地址加0后的值(a+0后还是原地址),这时的*(a+0)也是表示的一个值;
a[0]与*(a+0),并不是你所说的一个是元素地址和一个是元素内容。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xzjstc86
2011-08-15 · TA获得超过121个赞
知道答主
回答量:129
采纳率:0%
帮助的人:94万
展开全部
编译器就是这样解释的……
这是规定……

a[i]会被解释成*(a+i)

类似于为什么1+1=2

望楼主采纳~谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
frog3211
2011-08-15 · TA获得超过119个赞
知道答主
回答量:45
采纳率:100%
帮助的人:44万
展开全部
char a[3][4];
a是指向2维数组的首地址
*a是指向1维数组的首地址
a+1 地址向右偏移4个字节的地址
(*a)+1只是向右偏移1个字节的地址
**a这才是地址下的元素
a[0]与*(a+0)是等价的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式