Chinaunix

标题: (求助)指针与二维数组的关系 [打印本页]

作者: zamely    时间: 2014-01-15 10:28
标题: (求助)指针与二维数组的关系
    如图所示,定义了zip[4][2],图中箭头表示指向关系。                     
    1.想问我的这个图是正确的么?
    2.由于zip和zip[0]具有相同的数值(当然类型不相同),那么zip[0]是不是具有地址等于其数值呢?
    3.如果是,假设zip[0]地址addr,那么addr处的值也是addr,由于zip[0]指向zip[0][0],那么意味着addr存储的数值是zip[0][0],那么就会矛盾。
    我的理解一定有错,但我不知道哪里错了,还望指教。

QQ截图20140115102422.png (4 KB, 下载次数: 110)

QQ截图20140115102422.png

作者: 除美灭日平韩    时间: 2014-01-15 11:07
本人不才,说一下自己的看法哈

数组名代表数组首地址,而数组首地址与数组第一个元素的地址相同

zip[0]是zip[0][0]的地址,但是addr是zip[0]的地址,只是地址这个“值”相同
而不代表可以从addr指向zip[0][0]

作者: bruceteen    时间: 2014-01-15 11:44
那么addr处的值也是addr
------ 数组又不是指针
作者: w_anthony    时间: 2014-01-15 13:36
你可以理解为,只有zip是真实存在的,编译阶段zip会被作为一个符号,它有起始地址和大小,但是zip[0]或者zip[0][0],还是zip[1][0]都不是真实存在的;编译的时候遇到zip[0]、zip[0][0]、zip[1][0]等会根据你所指定的参数将地址从zip起始地址偏移过去;编译完毕zip符号也没有了。所以zip[0]等这些东西它有类型,但它并不“额外”占用任何内存空间。
作者: 除美灭日平韩    时间: 2014-01-15 13:52
回复 4# w_anthony

原理是按照偏移量来查找的是吧,我的那个说法就不对了,根本不存在那些中间地址,是吧?
学习了~
   
作者: www1862    时间: 2014-01-15 14:07
结论是数组的值不是指针?
作者: fergon    时间: 2014-01-15 15:20
本帖最后由 fergon 于 2014-01-15 15:23 编辑

要理解数组,我认为应该同时对几个概念作一番系统的认识,不要孤立地看待它。
变量、类型
指针、指针变量
一维数组与多维数组的关系

随着深入,还会遇上左值和右值这些令人恼火的东西。

这篇文章说得比较深入,你应该阅读一下。
http://blog.csdn.net/code_crash/article/details/4855027
http://blog.csdn.net/supermegaboy/article/category/622235
作者: zamely    时间: 2014-01-16 10:38
回复 7# fergon


    谢谢推荐这篇文章,我目前看的很吃力,有机会好好拜读!
作者: zamely    时间: 2014-01-16 10:39
回复 2# 除美灭日平韩


    谢谢回复,你说的是对的,我也可以理解。可能我的问题没有表述清楚,所以没得到我的答案!
作者: linyunxian    时间: 2014-01-16 10:54
回复 1# zamely

前面两点是对的,图也是正确的。第三点理解上有问题。

     3.如果是,假设zip[0]地址addr,那么addr处的值也是addr,由于zip[0]指向zip[0][0],那么意味着addr存储的数值是zip[0][0],那么就会矛盾。


作者: zamely    时间: 2014-01-16 11:56
回复 11# linyunxian


    如果两点是正确的,为何这个地方会错误了,还请指教!
作者: fergon    时间: 2014-01-16 12:30
本帖最后由 fergon 于 2014-01-16 12:32 编辑
zamely 发表于 2014-01-16 11:56
回复 11# linyunxian


因为C语言是以指针的形式来对数组寻址,zip[0]得到的其实是一个指针。print这个指针得到的是addr,而print zip[0][0]是zip数组的一个元素的值。留意一下类型变化应该不难理解吧?
我觉得@gvim会解释的很好,你找他应该没错。


作者: zamely    时间: 2014-01-16 15:03
回复 13# fergon


    明白你的意思,谢了,也希望斑竹@gvim能来解释下子咯~
作者: gvim    时间: 2014-01-16 22:33
回复 1# zamely

初学的吧,可以这样看这个问题。
你可以把问题定位在数据名和指针的关系上,注意是数组名。为什么不说是数组,是因为数组你只能知道它的存在,然你需要一种手段来表示这个存在,这个手段就是数组名和指针。
好了,问题解决了,数组名就是数组的一个名字一个表示,这个名字既不是指向,也不是存储,它就是数组,是一个地址的名字。你查查看你帖子里哪里谈论的是数组名,且出现了指向出现了存储,哪里就可能有问题了。

另外可以看看 http://bbs.chinaunix.net/thread-4060180-1-1.html
作者: zamely    时间: 2014-01-17 17:29
本帖最后由 zamely 于 2014-01-17 17:31 编辑

回复 15# gvim


    谢谢详细回答,算是初学者,说实话你说的这帖子我看的好累呀。思考后,我对于这个问题的解释是:数组名只是提供了一个我们访问数组元素的方法,这些引用、指向什么的它是给编译器去解释的,而不会再内存中储存!请问这样对么?
作者: gvim    时间: 2014-01-17 22:46
本帖最后由 gvim 于 2014-01-17 22:53 编辑

回复 16# zamely

是的,可以这样认为。C语言里数组名是静态的,指针是动态的。由于虚拟内存的线性性质,数组的索引在形式上可以用指针来处理,而数组名所表示的地址看起来也确实像一个指针(还有退化为指针的情况),因此很容易造成困扰。int a[10]; int *b = a; sizeof(a) 和 sizeof(b)的不同可以说明这一点。
作者: zamely    时间: 2014-01-18 19:00
回复 17# gvim


    明白了,非常感谢你拉~
作者: 资深项目经理    时间: 2014-01-18 20:45
数组和指针是两码事。

别被无良老师忽悠了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2