免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
41 [报告]
发表于 2012-12-23 14:02 |只看该作者
本帖最后由 Ager 于 2012-12-23 14:07 编辑
supermegaboy 发表于 2012-12-23 13:07
看得出来楼主进行了很多思考,不过还没有抓住要义。当我们要阐述数组与指针的联系(区别)时,首先要谈的是数组是什么、指针是什么,也就是应当先揭示两者的本质,在此基础上才能谈论他们之间的联系与区别。表面的语法形式可以作为一个辅助的说明,但不能作为主要的根据,这样做缺乏说服力。


谢谢大虾支持!

所以,我在帖子的第一句话里就这麽申明了:

在C语言中,指针与数组(或许,可以更为具体地说:指针标识符与数组标识符)之间关系紧密。

也就是说,我的帖子,主要就是讨论标识符:它们的由来(指它们在程序代码中如何生成)、在语言用法中的地位、直观特征等等。

关于“两者的本质”,尤其是所谓“本质性”的东西,我不太喜欢讨论,呵呵。。。

因为,在使用词法/语义要素(所谓“直观性”的东西)的角度来看,编程者(尤其是初学者)可以稍微地远离所谓“本质性”的东西。

(本主帖,主要就是写给初学者的,所以也谈到了诸如CSDN上的一些流谬对初学者的侵染。)

当然,所谓“本质性”的东西与所谓“直观性”的东西,两者无法(也不应该)完全相隔离,所以,帖子的最后一部分,稍微谈到了一些而已。

呵呵 {:3_193:}

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
42 [报告]
发表于 2012-12-23 21:10 |只看该作者
本帖最后由 gvim 于 2012-12-23 21:34 编辑

回复 13# pmerofc
@sephirosh-

ag写的有点罗嗦,呵呵,看了半天绕晕了。

sephirosh-的这句话个人觉得这话没什么错吧。数组是一种数据结构,指针用来在数组里定位或者说标识一个元素。就如同树也是一种数据结构,同样可以用指针在树里面定位或者说标识一个元素。数组是策略,指针是机制。策略放在那里都一样,而机制的话当然因语言和平台而异。
策略和机制分离当然是设计的准则之一。因为是先有的物理机器才有的C,所以C里面的指针就是直接的物理机制的映射,而数组(包括所有ADT)本身不在底层物理机器提供的机制之中。所以说作为机制的指针是操作作为策略的ADT(自然也就包括数组)的工具没什么不妥。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
43 [报告]
发表于 2012-12-23 21:28 |只看该作者
本帖最后由 gvim 于 2012-12-23 21:29 编辑

回复 1# Ager

没有运行期支持的语言只能靠编译器一个手段做手脚,只是这手脚做的确实让不少人糊里糊涂。当然有运行期支持的语言一旦要做起手脚来就编译器和运行期一起上,更能让人不明不白

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

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
45 [报告]
发表于 2012-12-23 21:58 |只看该作者
本帖最后由 gvim 于 2012-12-23 21:59 编辑

回复 44# pmerofc

指针是指针,类型系统是类型系统。指针!=类型。如果指针就是一种类型的话自然能够描述目标对象的所有属性,自然也就不应该存在ag帖子里说的函数调用时的退化情况了。
另外,窃以为简单的东西没必要复杂化,工程的东西没必要哲学化,越往复杂了说,越让人不解

论坛徽章:
0
46 [报告]
发表于 2012-12-23 22:03 |只看该作者
回复 45# gvim
同意!咱们是一路的
楼主跟PM大侠太学术了,哈哈

   

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

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
48 [报告]
发表于 2012-12-23 23:07 |只看该作者
回复 47# pmerofc

我自然知道标准里的标准名词。  

我说 指针!=类型 是因为指针无法独立作为有意义的元素进行计算(牵强点的话就是代数运算),它是一个负载类型的机制或者说工具。换句话说参与计算的是指针所负载的类型系统而不是指针本身。

那么我们看指针有什么操作(注意操作和计算不是一个东西,溢出是一个合法操作因为这个合法是对计算机而言但不是合法计算这个合法是对计算本身而言)。
解引用,姑且这么叫吧,解出来的东西是什么?是它承载的类型系统。
加减整数,加减出来的是什么?还是指针。可这个指针承载的仍然是别的类型系统。

也就是说指针仅对加减操作是封闭的,但这个封闭的操作对计算而言没有任何意义,因为你仍需将之解引用操作出来才能进行计算。甚至在没有他所负载的类型时,如void *的时候,却无法进行除了cast之外的任何操作。

而,int,char,struct等类型都可以作为独立存在的计算元素。

这么说吧:指针不过是物理机器的逻辑地址和间接寻址的高层映射,属于物理体系层面的东西,在C里面的地位只能作为机制工具存在而不是策略。
概念上越来越进化可实质上无法改变它不能独立存在计算的地位。

当然,字面上说,指针是“类型”。
   

论坛徽章:
0
49 [报告]
发表于 2012-12-24 01:34 |只看该作者
C语言类型系统由基本类型和推导规则组成。推导规则三种:
基础:void char short ...
如果T是基本类型,T属于类型系统。

导出:数组、指针
如果T属于类型系统,T*、T[]也都属于类型系统。

聚合:struct,union、函数
如果T、A1..An都属于类型系统,struct/union {A1; ...; An;}、T()(A1, ..., An)也属于类型系统。

论坛徽章:
0
50 [报告]
发表于 2012-12-24 01:38 |只看该作者
另规定void和函数类型不可独立用于声明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP