由指针和引用的区别引发的思考

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

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

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

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

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

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

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

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

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

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

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

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

4. 符号表是边填边用。

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

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

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

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

时间: 2024-11-08 03:31:37

由指针和引用的区别引发的思考的相关文章

指针与引用的区别以及引用的三种用法

1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一

转 浅谈C++中指针和引用的区别

浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a

C++中指针和引用的区别

此文转自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参

C++ 中指针与引用的区别

指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名.     ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化

指针与引用的区别和联系

指针与引用的区别: The difference between "pointer" and "reference" 区别1: 给指针A赋值的时侯,要么赋一个地址B,要么赋一个同类型的指针C ( 使用地址B赋值时,B中存储的值的类型要和A指针指向的类型一致.如果B指向的值用const 修饰,那么指针A在初始化时,最外面也要用const 修饰 使用指针C赋值时,如果指针C最外面使用const 修饰,如 const int * C  OR  const int * co

C++小知识:指针和引用的区别

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变.    而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:     指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传

向函数中传递指针和传递指针的引用的区别

如果是传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针:但 是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了 看个例子: #includ

指针和引用的区别(c/c++)

http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5.

【转】指针和引用的区别

c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小