现在的位置: 首页 > 综合 > 正文

伤不起的数组名

2012年05月10日 ⁄ 综合 ⁄ 共 1226字 ⁄ 字号 评论关闭

前两天写了一篇《再‘论’数组和指针》,本意只想记录一下自己的看《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给我最大的帮助;一直讨论这样的问题有没有意义,我个人觉得没有意义,语言的设计者都是为了让程序员写程序读程序更加的方便,让解决问题变得更加的高效,这也是程序语言发展的一个趋势吧,从面向过程到面向对象,代码的可读性越来越强,语法越来与易学,歧义越来越少。

      我以前是一个语法爱好者,直到参加了一个比赛,输的很惨,才发现自己解决问题的能力如此之差。语言这个东西就是一个工具,像这种研究可以做为一个午后茶,还是培养解决问题的思路最重要。。。。至少我得这样做了。

     

      总之,收获还是蛮大的,身边总是有各种各样的高手~

 

 

     

    

       

抱歉!评论已关闭.