1.基本概念

指针:指的是一块内存的地址值。
引用:是一块内存的别名。

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

而引用只是一个别名,逻辑上并不存在,在整个引用周期是不能被改变的,只能指向同一个变量。

2.能否为空值

指针是可以为空值的,可以不需要初始化。平时编程中,最讨厌的情况就是看到各种NullPointer,排查起来都不好排查。
引用不能为空值,因此必须进行初始化。所以引用的一个优点是它一定不为空,相对于指针不用检查它所指对象是否为空,这样增加了效率。

3.通过实例测试

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;int main(int argc, char const *argv[])
{int a = 1, b = 2, c = 3;int *p1;int &d = b;p1 = &a;printf("a: %d, a address is: %p\n", a, &a);printf("b: %d, b address is: %p\n", b, &b);printf("c: %d, c address is: %p\n", c, &c);printf("p1的地址为: %p, p1的数据为: %d\n", p1, *p1);printf("d: %d, d address is: %p\n\n", d, &d);d = c; // 等于b=d=c;p1 = &c; // 指针的地址可以变printf("a: %d, after modify, a address is: %p\n", a, &a);printf("b: %d, after modify, b address is: %p\n", b, &b);printf("c: %d, after modify, c address is: %p\n", c, &c);printf("p1的地址为: %p, p1的数据为: %d\n", p1, *p1);printf("d: %d, after modify, d address is: %p\n", d, &d);return 0;
}

代码输出为:

a: 1, a address is: 0x7ffee6a3333c
b: 2, b address is: 0x7ffee6a33338
c: 3, c address is: 0x7ffee6a33334
p1的地址为: 0x7ffee6a3333c, p1的数据为: 1
d: 2, d address is: 0x7ffee6a33338a: 1, after modify, a address is: 0x7ffee6a3333c
b: 3, after modify, b address is: 0x7ffee6a33338
c: 3, after modify, c address is: 0x7ffee6a33334
p1的地址为: 0x7ffee6a33334, p1的数据为: 3
d: 3, after modify, d address is: 0x7ffee6a33338

从上面代码不难看出,p1是可以改变其指向的内存地址的。而d不能改变指向的内存地址,只能改变该内存地址的存储数据。

4.引用的使用场景

引用的主要功能就是作为函数的参数和返回值。

看以下的例子,以常见的交换两个数字值为例。

#include<iostream>
#include<cstdlib>
using namespace std;void swap(int a, int b) {int tmp;tmp = a;a = b;b = tmp;
}void swap2(int* a, int* b) {int tmp;tmp = *a;*a = *b;*b = tmp;
}void swap3(int &a, int &b) {int tmp;tmp = a;a = b;b = tmp;
}int main(int argc, char const *argv[])
{int i = 1, j = 2;//swap(i, j);//swap2(&i, &j);swap3(i, j);printf("i=%d, j=%d", i, j);return 0;
}

上面有三种传递参数的方式:直接传递变量名,传递变量地址,以及传递引用。

如果我们执行swap(i, j)方法,显然在函数调用结束以后,main方法里面的i,j值并没有发生变化。

执行swap2(&i, &j)方法,形参是指针变量,实参是一个变量的地址,调用函数时,形参得到的实参变量的地址,因此指向实参的变量单元,可以实现在main方法里交换i,j值的目的。但是该方法不够直观,而且依旧是“值传递”的方式,只不过传递的是变量的地址而已。

当执行swap3(i, j)方法时,形参是声明的引用,调用函数的过程中,实现了引用的初始化,这是传入的实参就是变量,而不是数值,所以做到了真正意义上的“变量传递”,最后在main方法里面也交换了i, j的数值。

c++ 指针与引用区别相关推荐

  1. 一篇文章牢记C/C++指针和引用区别

    指针有自己的一块空间,而引用只是一个别名:(本质) 使用sizeof看一个指针的大小是4(32位下),而引用则是被引用对象的大小: (大小) 指针可以被初始化为NULL,而引用必须被初始化且必须是一个 ...

  2. 指针与引用有什么区别?

    指针(Pointer)持有另一个对象的地址,使我们能够间接地操作这个对象.引用(Reference)有时候又称为别名,它可以用作对象的另一个名字.它们都是让你间接引用其他对象. 从语法的角度比较,二者 ...

  3. c++:指针和引用的区别

    目录 前言: 1.引用概念上是定义一个变量的别名,而指针是存储一个变量的地址. 2.引用在定义时必须要初始化,但是指针没有要求. 3.引用在初始化时引用一个实体后,就不能再引用其他实体,因为其本质是一 ...

  4. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

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

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: '*'表示这是一个指针变量,指针名为定义的指针变量名, ...

  6. 24.指针和引用的区别

    在面试时经常会被问到 指针和引用的区别,虽然问题很简单但还是总结一下! 指针和引用的区别其实有太多了,主要的区别大概是这样子: 1)指针声明的时候可以不被初始化(有可能成为野指针),但是引用必须要进行 ...

  7. 2020-12-6(从反汇编理解指针和引用的区别)

    这是我10个月前看到的一篇博客吧,感觉分析指针和引用的文章这是我目前见过讲解得最清晰的一篇: 本文主要基于反汇编代码,从初始化.赋值以及取地址三个角度来理解指针和引用的区别. 初始化 写出以下代码并查 ...

  8. C/C++ 中指针和引用的区别

    C/C++ 中指针和引用的区别 1.指针有自己的一块空间,而引用只是一个别名: 2.使用 sizeof 看一个指针的大小是 4,而引用则是被引用对象的大小: 3.指针可以被初始化为 NULL,而引用必 ...

  9. 【转】指针和引用的区别

    c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使 ...

  10. python指针引用的区别_C++基础:指针和引用的区别

    C++基础:指针和引用的区别 *例 int a; int &b = a; 其中b是a的引用,b引用了a,a被b引用.b 相当于 a 的别名,对 b 的任何操作就是对a的操作.所以b既不是a的拷 ...

最新文章

  1. (5.2) Tomcat 8 源码, 初始化组件
  2. 获取表单内部元素的N种方法
  3. python怎么输入程序代码_学习用 Thonny 写代码: 一个面向初学者的Python IDE
  4. 文本挖掘(part3)--词袋模型
  5. SAP CAM - Cloud Access Manager
  6. The podfile
  7. 2020双11,阿里巴巴集团数万数据库系统全面上云揭秘
  8. 使用PyCharm连接云主机教程
  9. 动态参数 maven_Spring Security 动态url权限控制(三)
  10. ubuntu中bash,sh,./,bash区别
  11. git 提交代码的好习惯
  12. Eclipse安装教程
  13. linux那些事之页迁移(page migratiom)
  14. mac系统如何获取最好权限删除顽固文件?
  15. 文本特征提取:词袋模型/词集模型,TF-IDF
  16. secure IRS aided ISAC
  17. Led台灯对眼睛好吗?2022双十一不伤眼的护眼灯推荐
  18. canvas实现流星特效
  19. Linux下查找指定日期的文件
  20. 使用security和jwt进行安全登录

热门文章

  1. 手机圈老兵任伟光加盟联想
  2. MAC 终端基本命令
  3. wireless 时好时断的一些解决的建议
  4. 网络模拟器NS-2及其应用分析
  5. 如何实现 java 接口中的部分方法
  6. 妖(至250线)——善始善终
  7. 【PHP基础】PHP接口调用与json数据处理
  8. linux系统学习第二天
  9. New Concept English Two 5
  10. mvc:annotation-driven/与mvc:default-servlet-handler/之间的一个问题