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

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

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

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

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

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

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

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

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

★相同点:

●都是地址的概念;

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

★不同点:

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

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

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

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

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

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

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

关于引用参数:

1. 引用参数不进行拷贝,相当于直接拿变量来用, 函数入参效率高。
2. 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高, 因为在使用引用之前不需要测试它的合法性。

如:

C/C++ code

template

inline const T& Min(const T& a,const T& b)

{

return a

}

在以下情况下你应该使用指针
一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),
二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。 
还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。 
vector v(10);  // 建立整形向量(vector),大小为10; 
v[5] = 10;  // 这个被赋值的目标对象就是操作符[]返回的值     
如果操作符[]返回一个指针,那么后一个语句就得这样写: 
*v[5] = 10; 
但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款M30)

关于引用返回值:

1.使用引用返回值时,应注意不要返回函数内局部变量,因为函数结束时,局部变量会被销毁。
2.若把引用返回值赋值给一个对象,会执行该引用的拷贝。

如:
int& fun(int& x)
{
    return x;
}

int main(int argc, char* argv[])
{
    int name = 123;
    int &x = fun(name); 
    x += 6;
    printf("name=%d, x=%d, &name=%d, &x=%d \r\n", name,x, &name,&x);
 
    int x1 = fun(name); //执行operator=
    x1 += 6;
    printf("name=%d, x1=%d, &name=%d, &x1=%d \r\n", name,x1, &name,&x1);
    return 0;
}

打印结果:
name=129, x=129, &name=1245040, &x=1245040
name=129, x1=135, &name=1245040, &x1=1245032

引用 和指针 ,简单, 一怔见血相关推荐

  1. c++引用与指针的区别

    ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...

  2. 同时用引用和指针 int *a;

    同时用引用和指针可以吗? 见到一个这样的声明 int *&a: 这是什么意思? a 是一个 指向 int* 的引用. 你可以了解一下右左法则,读复杂类型声明(当然,这个int*& a还 ...

  3. C++智能指针简单剖析

    导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...

  4. 面向对象简述--对象、引用、指针

    类和成员对象 [定义类] (1)两个重要概念: 类(class):类是某一批对象的抽象,可以把类理解成某一种概念. 对象(object,也被称为实例,instance):对象才是一个实际存在的实体. ...

  5. C++中引用和指针的不同

    引用,其本质就是指针,将它用在一些特别的场合,会比指针更简洁,更方便.具体说来,指针多用于动态内存管理和对数组的操作等,C风格的代码接收和返回指针:引用则往往用在接收和返回类类型的名字空间域函数或类域 ...

  6. 函数名称前面加引用“”或指针符号“*”的意思

    函数名称前面加引用"&"或指针符号"*"的意思 http://blog.csdn.net/qq_38124695/article/details/781 ...

  7. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  8. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

  9. 引用和指针的差别,数组和指针的差别

    一:引用和指针的差别 1:引用并不是对象,它仅仅是为一个已存在的对象所起的另外一个名字.必须初始化,并且无法改变它绑定的对象,之后每次使用这个引用都是訪问最初绑定的那个对象. 2:指针本身是对象,能够 ...

最新文章

  1. 深入浅出NIO之Channel、Buffer
  2. Photoshop 通道
  3. 【恋上数据结构】排序算法前置知识及代码环境准备
  4. The following types may not be used as proxies 异常处理办法
  5. VXLAN配置实例(三)——VXLAN集中式双活网关
  6. 数字序列中某一位的数字
  7. 基于JavaEE电子商务交易系统
  8. 智能建筑现状及发展趋势,建筑智能化的发展趋势
  9. Java____利用HSSF导出、导入excel文件
  10. 苹果开发者过期续费流程
  11. mediapipe示例运行
  12. linux中彻底分析#!bin/sh是什么意思
  13. 记一次云服务器挖矿病毒处理过程
  14. 高德地图动态锁定地图不能放大缩小和滑动
  15. 【web】movie review——静态页面训练、css训练
  16. 线控转向系统的carsim与simulink联合仿真
  17. Nature Gradient 自然梯度
  18. 就这样,我走完了程序员的前五年。一路风雨泥泞,前方阳光正好。
  19. 万圣节H5的经典案例,速收藏!
  20. 微信小程序实现下拉菜单效果

热门文章

  1. 【游戏渲染】【译】Unity3D Shader 新手教程(1/6)
  2. python 求最大内切圆和最小外接圆问题
  3. Word从指定页开始插入页码
  4. 用蚕茧表示法写简洁实用的接口文档
  5. 你是怎样毁掉自己的?
  6. 每日英语好文翻译(11)
  7. 根据屏幕大小动态设置字体rem
  8. php获取笔顺矢量,笔顺生成器在线-笔顺生成器php版源码下载-西西软件下载
  9. QT 关于颜色的总结
  10. 组合数据类型(集合)