免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Ager
打印 上一主题 下一主题

[C] 浅谈一下C语言中的指针与数组的关系 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
91 [报告]
发表于 2012-12-26 16:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
92 [报告]
发表于 2012-12-26 20:12 |只看该作者
本帖最后由 sqfasd 于 2012-12-26 20:14 编辑
pmerofc 发表于 2012-12-26 16:22
在很多情况下数组名确实是指向起始元素的指针
这难道有什么疑问吗

疑问大了,您这句真有失水准
最起码的指针会分配内存,数组名只能是数组第一个元素地址的代号而已,整个数组除了所有元素的内存外,不会分配额外的内存
而且数组有数组的类型,指针有指针的类型,怎么能混淆?

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
93 [报告]
发表于 2012-12-26 20:21 |只看该作者
linux_c_py_php 发表于 2012-12-26 15:33
数组名是第一个元素的地址, 又没说过数组名是第一个元素的指针,


龙哥大虾,你说反了吧?笔误?

呵呵 。。。。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
94 [报告]
发表于 2012-12-26 20:27 |只看该作者
本帖最后由 Ager 于 2012-12-26 20:29 编辑
sqfasd 发表于 2012-12-26 20:12
疑问大了,您这句真有失水准
最起码的指针会分配内存,数组名只能是数组第一个元素地址的代号而已


。。。。

以下关键词,求关注:

内情向量  符号表 。。。。


干脆再呼召一下 键盘农夫 @KBTiller 大虾吧。。。



论坛徽章:
0
95 [报告]
发表于 2012-12-26 20:37 |只看该作者
回复 94# Ager

LZ别吓唬我
可能我语言表达的没你们那么专业和严谨
但这些本质性的东西,我还是分得清的
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
96 [报告]
发表于 2012-12-26 20:44 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
97 [报告]
发表于 2012-12-26 20:52 |只看该作者
回复 96# pmerofc

那可能咱理解的指针概念不一样
我理解的指针是个左值
&i尽管长的像指针,但它是个右值,不会分配内存
难道是我一直都误会了??

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
98 [报告]
发表于 2012-12-26 20:53 |只看该作者
本帖最后由 Ager 于 2012-12-26 21:05 编辑

实在搞不清楚,我们做一个对比:

对于数组x的第i个元素(从0起头序),i显然是一个整数

x[ i ]

—— 当数组标识符x出现在(除了sizeof或&的之外的)表达式语境中,它被转换为指向数组首个元素的指针

所以,与x[ i ]等效的表达式

*(x + i)    ..........(式子 1 )

当中的 指 针 加 法,才能成立

而另一个方面,若用地址(偏移量)来解释的话,则是:

x[ i ]的偏移地址是:

BASE(Array x) + SIZEOF(Each Element of Array x) * i              ..........(式子 2 )

在式子2中的SIZEOF(Each Element of Array x)成分,是式子1的代码成分里面所没有的

所以,式子1,就叫做:指针加法!

指。针。加。法。

呵呵:)







论坛徽章:
0
99 [报告]
发表于 2012-12-26 21:04 |只看该作者
回复 98# Ager

还是太表面了,没有触及到本质,这些语法层面的东西,编译器想怎么解释想怎么处理都可以,问题是到了执行环境下,是什么一种状况?
int *p;
这就会分配内存了
&p
这只能作为rvalue,编译器直接计算,不会因为一个“取址”操作而为它分配空间,这是本质的区别吧
另外
int a[5];
assert(a == &a);
怎么解释
(&a) + 1
又怎么解释
按你们那种表面理解,根本解释不了
   

论坛徽章:
0
100 [报告]
发表于 2012-12-26 21:12 |只看该作者
回复 97# sqfasd

你的意思是「是指针对象」,他的意思是「类型是指针」。

另外 1 楼有提到,在不作为 sizeof 和单目 & 的操作数时,数组类型的表达式才会转换为相应的指针类型。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP