指针和引用的异同点总结

异同点 指针  引用
1

指针是一个变量,本身是一个实体,指针中的内容是一个地址值

该值指向内存中的一个存储单元

引用只是一个别名,实质上指向同一对象

系统不为引用分配内存

2 指针可以为空,声明定义时可以不进行初始化 引用不可以为空,声明定义是必须绑定到一个变量上
3 非const指针在初始化后可以重新指向不同的对象,指向其他存储单元 引用与被引用对象一旦绑定就不能再更改
4 指针可以由多级,指向指针的指针,指向指向指针的指针的指针等 引用只能有一级,因为不是一个实体,不存在引用的引用
5 指针的使用过程中需要解引用才能操作指针指向的对象

引用本身只是一个别名,对引用的操作即是对原变量的操作,

自增自减是原变量的增减

6

指针的自增自减是地址的改变,改变了多少根其所指向的类型有关

7

sizeof()得到的是指针本身的大小,一般是4个字节

但当指针是数组名时,sizeof()指的是数组在内存中占用的空间大小

sizeof()得到的是原变量的大小
8 数组不能引用,但数组指针可以引用
9 一个变量可以由多个引用,同样一个变量也可以是多个指针指向的对象
10 void本身不是类型,不能有引用
11

指针需要注意内存泄露的问题,因为如果其所指向的内存被释放,需要根据情况将指针的值改为NULL,防止其成为野指针

而引用不存在这样的问题

类型标识符 &函数名(形参列表及类型说明) {函数体}

如果定义在类外,&放在类名之前,返回值类型之后

  • 以引用做为函数返回值,函数名前加&
  • 不产生被返回值的副本
  • 函数的返回类型决定函数调用是否为左值,调用一个返回引用的函数得到左值,其他返回类型得到右值,常量引用(对const的引用)不可以被赋值
  • 不能返回函数体内new的内存,被函数返回的引用只是作为临时变量出现而没有被赋值给一个实际变量,空间无法释放,会造成内存泄漏

实际操作中采用指针还是引用取决于是否需要考虑“不指向任何对象”或“在不同时间指向不同对象”,如果需要则使用指针,否则就引用。

  • 使用引用传递函数参数时,内存中并没有产生实参的副本,直接对实参进行操作,效率高,内存消耗也少。
  • 使用指针作为函数参数时,在被调函数中要给形参分配存储单元,内存空间,炳耀重复使用*解引用,易出错且可读性不好,而且在主函数的调用点必须用变量的地址做实参。

C++之指针和引用的更多相关文章

  1. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  2. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  3. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  4. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  5. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  6. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  7. c++指针与引用问题

    本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...

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

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  9. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

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

      http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...

随机推荐

  1. Android中实现异步轮询上传文件

    前言 前段时间要求项目中需要实现一个刷卡考勤的功能,因为涉及到上传图片文件,为加快考勤的速度,封装了一个异步轮询上传文件的帮助类 效果  先上效果图 设计思路 数据库使用的框架是GreenDao,一个 ...

  2. ES6,箭头函数 (=>)注意点

    函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误. 不可以使用arguments对象,该对象在函数体内不存 ...

  3. 使用docker安装虚拟机并打开ssh连接

    一.需求 最近有个需求,要连接很多个linux系统进行测试软件功能,但是我这里只有几个虚拟机,所以需要使用docker来安装几十个或者上百个虚拟机来进行测试. 二.安装docker 这里就不演示怎么安 ...

  4. 导入做好的java项目出现下面的错误:The project cannot be built until build path errors are resolved

    例子:       作者在eclipse中导入一个新的项目时,出现了三个错误,如图1中所示: 图1 3 errors 原因分析:        在这个工程中,作者在写的时候,在build path中添 ...

  5. Kubernetes服务发现入门:如何高效管理服务?

    愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率.Kubernetes为微服务提供了完美的环境,并能够让其与Kubernetes的工具组件和功能兼容.当应用程序的每个部分放置在一个容器中,整个 ...

  6. super()派生使用中的常见两个错误

    """ super()派生可以继承父类的属性 --super()派生继承父类的语法是:super().__init__() --super().__init__()中的_ ...

  7. Http协议 & Servlet

    Http协议&Servlet Http协议 什么是协议 双方在交互.通讯的时候遵守的一种规范.规则. http协议 针对网络上的客户端与服务器端在执行http请求的时候,遵守的一种规范.其实就 ...

  8. 安卓逆向基础(001)-APK安装流程

    1.在/data/app下以报名为文件夹名新建文件夹 APK包存放在这里 以及lib文件 存放so 2./data/dalvik-cache 存放dex dex是dalvik虚拟机可执行文件 3./d ...

  9. 一段简单的关于字符串的 Java 代码竟考察了这么多东西

    下面的代码运行结果是什么?解释一下为什么会有这些差异. String s1 = "hello";String s2 = s1 + ",world";String ...

  10. 聊一聊看似简单的Promise.prototype.then()方法

    Promise.prototype.then() Proise实例的then方法是定义在原型对象Promise.prototype上的,它的作用是为Promise实例添加状态改变时的回调函数. 该方法 ...