博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由指针和引用的区别引发的思考
阅读量:5987 次
发布时间:2019-06-20

本文共 1006 字,大约阅读时间需要 3 分钟。

指针和引用一直在用,但是却从来没有仔细思考过他们真正的区别在哪里,一直都是照本宣科的理解,引用就是变量的别名,引用确定后就不能修改,原因是什么呢?

现在就来弄清楚事情的真相, 区别究竟在哪里?

下面这段话应该可以从本质上来解释指针和引用的区别

程序在编译的时候分别将指针和引用添加到符号表上, 符号表上记录的是变量,以及变量所对应的地址, 指针变量在符号表上对应的地址为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值, 符号表生成后就不会再改,因此指针可以改变其指向的变量地址。 而引用对象则不能改。

ok, 看完这段话,我觉得关于指针和变量的区别,我们也可以真正理解了, 区别是什么呢?

1. 指针 可以指向不同的变量,引用在定义的时候就确定了。 

  因为指针本身作为一个变量,在内存中是占有一个空间的,这个地址里边存的值就是指针的目标地址, 当然作为一个变量,他当然可以随意的修改值,即可以随意的指向不同的变量

  而引用呢! 在定义引用的时候,并没有给他分配存储空间,而只是在符号表里给他添加了一条记录,对应的地址根本就是原来的变量的地址。 所以说引用就是变量的一个别名

现在, 关于引用和指针的区别,已经搞清楚了,但是又有一个新问题,  “符号表”, 符号表是个什么玩意?怎么生成的?

1. 在编译过程中,编译程序会不断汇集和反复查证出现在源程序中各种名字的属性和特征信息等有关信息, 这些信息通常会保存在一张或者几张符号表里。

2. 符号表每一项有两部分, 一部分是名字(标示符), 另一部分是名字属性(标示符的有关信息), 就是我们上边讲到的标示符的地址

3. 编译过程中,每当扫描器扫描出一个名字后,编译程序就查阅符号表,看其是否在在符号表中, 如果是一个新名字,那就加入符号表, 他的有关信息将在词法分析和语义分析过程中陆续加入符号表

4. 符号表是边填边用。

现在, 符号表已经弄清楚了,我又想到了一些跟符号表相关的一些知识

1. 为什么C++可以实现重载, 那就是他在编译的时候,在创建符号表的时候,做了一些手脚

2. 为什么gdb需要加上-g, -g参数做了什么事情, 就是因为在编译的时候加了符号表

3. strip 做了什么事情,为什么可以使可执行文件变小? 去掉了符号表

 

转载于:https://www.cnblogs.com/ohome/p/3973072.html

你可能感兴趣的文章
java中的设计模式一 装饰模式
查看>>
PL/pgSQL学习笔记之五
查看>>
Android 经验: 5555 端口会被 adb 误认为 emulator
查看>>
Android手机便携式wifi的使用及无线数据传输(主要针对XP系统)
查看>>
MFC控件(8):command button与syslink control
查看>>
Java生成唯一GUID
查看>>
str_replace使用
查看>>
[Head First设计模式]一个人的平安夜——单例模式
查看>>
Asp.Net Web API 2第四课——HttpClient消息处理器
查看>>
图例解析四大UML关系【转】
查看>>
微信公共服务平台开发(.Net 的实现)4-------语音识别
查看>>
linux 添加用户
查看>>
[转]大小端问题
查看>>
C#从SQL server数据库中读取l图片和存入图片
查看>>
paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结
查看>>
Frameworks 目录
查看>>
Android -- SharedPreferences存储信息
查看>>
C++的函数重载和main函数之外的工作
查看>>
js中的hasOwnProperty和isPrototypeOf方法
查看>>
杂七杂八的面试概念
查看>>