指针和引用的异同点总结

异同点 指针  引用
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. layim手机版嵌入app

    感觉记忆力不行了,才做了就有点忘了.先简单做下记录... 遇到的问题 需要类似微信的语音发送功能 前端发送给后端,在mogodb中用二进制存储.后端取到数据发送给我的也是blob.前端拿到数据就变了. ...

  2. JVM系列三(垃圾收集器).

    一.概述 1. 哪些内存需要回收 上篇文章 我们介绍了 Java 内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭,在这几个区域内就不需要过多考虑回收的问题 ...

  3. 机会来了!5G时代带来新闻传播行业的变革!

    5G时代到来!新闻传播行业大变革! 1.作为一名体育生进入的新闻传播学院,传统的新闻媒体能力已不再具有优势,意味着我有翻身的机会了! 从一开始进入大学,由于高中的知识储备不如其他人,尤其是英语能力方面 ...

  4. node+express 配置安装以及数据解析,cookie,session

    一.express安装,创建服务 (1)安装:npm install express --save(2)创建服务 server.js: const express = require('express ...

  5. 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...

  6. prometheus动态刷新rule

    Prometheus的target是支持动态更新的,例如通过file_sd_configs配置将target放置到yaml文件中,当yaml文件中的内容发生变化时,Prometheus会自动更新自身的 ...

  7. NodeJS3-2基础API----Buffer(缓冲器)

    Buffer(缓冲器) Buffer是用于处理二进制数据流的 实例类似整数数组,大小固定(实例化之后,是多大就多大,不能进行变更) C++代码在V8 对外分配物理内存 Buffer是全局变量,没必要使 ...

  8. Java设计模式整理

    一.创建型模式 1.抽象工厂模式(AbstractFactory): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类. 案例:https://www.cnblogs.com/lfx ...

  9. Python:日期和时间的处理模块及相关函数

    Python:日期和时间的处理模块及相关函数 Python 提供 time 模块和 calendar 模块用于格式化日期和时间. 一.时间戳 在Python中,时间戳是以秒为单位的浮点小数,它是指格林 ...

  10. 阿里云服务器部署Tornado应用

    本篇详细介绍tornado应用部署到阿里云服务器上的全过程. Tornado程序地址:github https://github.com/ddong8/ihasy.git 准备工作:阿里云服务器Cen ...