前两天写了一篇《再‘论’数组和指针》,本意只想记录一下自己的看《C专家编程》的体会,说明一下数组做为参数的时候会被转换为指针,但是,大家貌似对这个都没有什么兴趣,反而都在一个数组名表示神马的问题上纠结来纠结去。
我写下了这么一句话,
char a[10] = "abcde";
补充一点背景知识:a保存的是数组的第一个元素a[0]的地址。
首先感谢很多朋友的发表自己的见解,这么说的确有些不妥,或者说a保存"了"比较合适,但是我觉得纠结于这个问题太无聊了,其实只要弄清楚一个问题就好了吧,a既然保存了数据,a在哪里?
a不在内存里,a在符号表里。
符号表是编译原理中的一个概念,应用于编译器的词法分析和语义分析两个阶段。词法分析的目标是让编译器能知道这是个数组就好了,那么语义分析阶段就需要确定这个数组的具体空间了。下面是我以前写过的一个很水的编译器的一个符号表的例子
说白了符号表就是告诉编译器这些符号是什么意义,在表中标记一下
比如下边的a\b\c\d就是四个不同的变量,40表示他们都是整型
同样数组也是一样的道理,图中的符号表是不完整的,因为还没有变量的地址。
所以我们定义了一个数组,编译器就会在符号表中加入数组的名字,a,并且根据其指定的大小,开辟一段内存空间,把这段内存空间的首地址(也就是第一个元素的地址)存入符号表,这也就是为什么我们通过数组名就可以去访问数组的元素了。编译器这么做是为了使我们使用数组更加的方便,易懂。
我们总是习惯把数组名和指针放在一起讨论,指针是一个内存中实实在在的变量,而数组名只是编译器做的一个符号常量。
有的朋友说数组名保存了n个元素对象,我觉得这么说也没什么不妥,看你站在什么角度,为什么可以这么说,一是因为a[]操作至少使我们看上去是这样的,二是因为sizeof操作符,比如sizeof(a)会得到数组的实际大小。
也有人说a是一个内存地址,也没有什么不妥的,因为编译器允许我们直接把a作为数组首地址来用。
(到这里您已经可以关掉这个页面了)
写这些的感觉是想说一下我的想法,首先讨论这个问题有没有意义,答案是有意义,可以更多的了解一下内存以及编译器的细节,我觉的这也是学C给我最大的帮助;一直讨论这样的问题有没有意义,我个人觉得没有意义,语言的设计者都是为了让程序员写程序读程序更加的方便,让解决问题变得更加的高效,这也是程序语言发展的一个趋势吧,从面向过程到面向对象,代码的可读性越来越强,语法越来与易学,歧义越来越少。
我以前是一个语法爱好者,直到参加了一个比赛,输的很惨,才发现自己解决问题的能力如此之差。语言这个东西就是一个工具,像这种研究可以做为一个午后茶,还是培养解决问题的思路最重要。。。。至少我得这样做了。
总之,收获还是蛮大的,身边总是有各种各样的高手~