指针和引用一直在用,但是却从来没有仔细思考过他们真正的区别在哪里,一直都是照本宣科的理解,引用就是变量的别名,引用确定后就不能修改,原因是什么呢?
现在就来弄清楚事情的真相, 区别究竟在哪里?
下面这段话应该可以从本质上来解释指针和引用的区别
程序在编译的时候分别将指针和引用添加到符号表上, 符号表上记录的是变量,以及变量所对应的地址, 指针变量在符号表上对应的地址为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值, 符号表生成后就不会再改,因此指针可以改变其指向的变量地址。 而引用对象则不能改。
ok, 看完这段话,我觉得关于指针和变量的区别,我们也可以真正理解了, 区别是什么呢?
1. 指针 可以指向不同的变量,引用在定义的时候就确定了。
因为指针本身作为一个变量,在内存中是占有一个空间的,这个地址里边存的值就是指针的目标地址, 当然作为一个变量,他当然可以随意的修改值,即可以随意的指向不同的变量
而引用呢! 在定义引用的时候,并没有给他分配存储空间,而只是在符号表里给他添加了一条记录,对应的地址根本就是原来的变量的地址。 所以说引用就是变量的一个别名
现在, 关于引用和指针的区别,已经搞清楚了,但是又有一个新问题, “符号表”, 符号表是个什么玩意?怎么生成的?
1. 在编译过程中,编译程序会不断汇集和反复查证出现在源程序中各种名字的属性和特征信息等有关信息, 这些信息通常会保存在一张或者几张符号表里。
2. 符号表每一项有两部分, 一部分是名字(标示符), 另一部分是名字属性(标示符的有关信息), 就是我们上边讲到的标示符的地址
3. 编译过程中,每当扫描器扫描出一个名字后,编译程序就查阅符号表,看其是否在在符号表中, 如果是一个新名字,那就加入符号表, 他的有关信息将在词法分析和语义分析过程中陆续加入符号表
4. 符号表是边填边用。
现在, 符号表已经弄清楚了,我又想到了一些跟符号表相关的一些知识
1. 为什么C++可以实现重载, 那就是他在编译的时候,在创建符号表的时候,做了一些手脚
2. 为什么gdb需要加上-g, -g参数做了什么事情, 就是因为在编译的时候加了符号表
3. strip 做了什么事情,为什么可以使可执行文件变小? 去掉了符号表