免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 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
2 [报告]
发表于 2012-12-24 01:38 |显示全部楼层
另规定void和函数类型不可独立用于声明。

论坛徽章:
0
3 [报告]
发表于 2012-12-24 10:14 |显示全部楼层
回复 58# timothyqiu


    你先前的认为是对的。int *p=&a 应该分为 int 和 *p=&a 两部分,后面的*(就和楼主在一楼阐述[]一样)和运算符的*是两码事,纯属巧合。声明里面的 * 是declarator的一部分,非运算符。

初始化属于declarator,初始化的是identifier。
  1. int *p1 = &a1, *p2 = &a2;

  2. int (*pf1)(int, int) = &sum, (*pf2)(int) = &abs;
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-12-24 10:50 |显示全部楼层
回复 63# timothyqiu


    好吧,属于init-declarator!

论坛徽章:
0
5 [报告]
发表于 2012-12-24 11:47 |显示全部楼层
回复 65# timothyqiu


   
「init-declarator」的意思是「initializer 和 declarator」啊,只是用来解释语法的中间产物,不是实际存在的概念……


我认为是initialized-declarator,你可以看标准所有带连字符的词,除了个别identifier-nondigit之外,连字符之前都做定语。

至于是否实际存在,我不考虑,反正都是看不见摸不着的东西。

K&R说的道理很简单,操作却很复杂。他将声明的标识符代入到表达式中去解释,拐了个大弯。

就好比5+5为什么等于10?K&R说因为5往后再数5个数就是10,多么通俗易懂。实际操作需要数5个数吗?大家从小学学的不都是10以内背下来,10以上竖式计算。研究数数只有幼儿园和大学去研究。幼儿园只能研究数数,大学要研究集合论,什么有限集合、无限集合、可数、不可数、可枚举、不可枚举。要说自打会数数起就知道自然数是可数的了,还用你去花一页纸证明自然数集合是可数的?居然还用数学归纳法证明。

论坛徽章:
0
6 [报告]
发表于 2012-12-24 14:32 |显示全部楼层
timothyqiu 发表于 2012-12-24 12:47
回复 67# sonicling

也终究要以作者的本意为正解,不是吗?


作者的本意是什么我不清楚,只知道他们出了本书,说了些话。如果对于C语言的任何解释都必须在思想上与他们保持一致的话,C语言这东西不研究也罢,没意思。

我没有说K&R的解释错,但是的确绕远了。我说“initializer属于declarator”,不管对于错,好歹initializer和declarator被写在同一个产生式里面了,就算你不认同从属关系,总还是有个什么关系吧。把声明放到表达式中去解释。。。声明和表达式在标准中都跨章节了,这关系比initializer和declarator的关系不知道远了十万八千里,还要把这个捧为正朔?

还是那句话:初始化是属于声明器的,被初始化的是标识符。这句话适用于变量带初始化声明的所有情况,信不信由你。

这句话回答了@Ager 的“那个“int *p=&a;” 到底是在对“p”初始化,还是对“*p”初始化?” 的问题。

论坛徽章:
0
7 [报告]
发表于 2012-12-24 15:00 |显示全部楼层
@timothyqiu

要怪就怪C的声明太复杂,人家C#的就简单许多,类型都放在标识符左边,初始化都放在右边。
  1. string[] a, b;
复制代码
a和b都是string[]类型。

C语言就不一样了,char a[] = "hello", *b = "hello";  同一条声明语句里相同初始化的a和b的类型不一样,值也不一样,这不是蛋疼吗?

C语言声明那一章里最复杂的就是声明器那节。C++标准把声明器单独拎出来讲,和声明并列,足见其复杂程度。而且顺带说一下,C++标准里的initializer就是放在declarator那一章里讲的,我认为这么划分比C标准更合理。

declarator包含了部分类型信息,而且这部分信息很难和被声明的标识符剥离。所以形式上被初始化的是declarator,实质上被初始化的只能是标识符。

论坛徽章:
0
8 [报告]
发表于 2012-12-24 19:20 |显示全部楼层
回复 72# timothyqiu


   
sequence of declarators, each of which can have an initializer



我没说initializer是declarator,我只说属于。就好象说这栋房子属于我,并不是说这栋房子是我这个人的一部分。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP