当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-23

    本文导语:  从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有...

从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。

而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。

在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。

为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:

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

最后,总结一下指针和引用的相同点和不同点:

★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

●指针是一个实体,而引用仅是个别名;

●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

●引用没有const,指针有const,const的指针不可变;

●引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是 (引用比指针多了类型检查


    
 
 

您可能感兴趣的文章:

  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 大家说java没有指针,是好还是坏呢,为什么c++中
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 深入解析C++中的指针数组与指向指针的指针
  • JAVA中的引址和C++中的指针有什么区别??高手向教!!
  • C++中指向对象的常指针与指向常对象的指针详解
  • C++中返回指向函数的指针示例
  • c++函数指针和回调函数示例
  • c++里有函数指针,java里没有,如果我想实现这样的功能,该怎么做呢?请进。。。
  • C++指向函数的指针实例解析
  • C++中给二维指针分配内存(实现代码)
  • C++ 在堆上开辟与释放二维、三维指针详细解析
  • C++指向函数的指针用法详解
  • C++中用指向数组的指针作函数参数
  • c++传递函数指针和bind的示例
  • c++将引用或者是指针作为函数参数实现实参的运算
  • 基于C++ map中key使用指针问题的详解
  • c++函数中的指针参数与地址参数区别介绍
  • C++指针数组、数组指针、数组名及二维数组技巧汇总
  • c++函数指针使用示例分享
  • c++回调之利用函数指针示例
  • HTML教程 iis7站长之家
  • 引用与指针的效率问题
  • JAVA中函数调用时,能不能向 C/C++一样函数的入口参数可以为传出值(就是引用,或指针)
  • 基于指针pointers和引用references的区别分析
  • java函数传参数有“传值”与“传引用(指针)”之分吗?
  • c++ 指针与引用的区别介绍及使用说明
  • 智能指针与弱引用详解
  • java及C++中传值传递、引用传递和指针方式的理解
  • c++中引用和指针的区别和联系
  • 深入分析C语言中结构体指针的定义与引用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • gcc编译CORBA程序如何关闭智能指针转换为普通指针的警告
  • 指向类成员函数的指针其实并非指针
  • 谁说java没指针,我觉得全是指针才对
  • 一个用指针传递内存的问题(如果传进去的是三重指针确不行)
  • busybox中的gzip运行过程中出现page fault错误,并指出出错的指针,但是怎么使用gdb调试,找到指针对应的语句?
  • 关于free指针的指针分量
  • C语言中常量指针与指针常量区别浅析
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 关于指针变量,struct 变量,指针使用的一些疑惑,望高手指教
  • 深入理解数组指针与指针数组的区别
  • 深入解析函数指针与返回函数的指针
  • 指向变量的常指针与指向常变量的指针详细解析
  • 结构指针类型强制转换
  • 请问return语句会执行哪些操作?在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
  • 请问如何在linux (redhat)下传递一维数组指针?
  • C:函数指针
  • 利用函数指针的好处是什么?
  • 野指针问题
  • 关于指针的地址重的问题,求教了。
  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3