指针和引用的异同点总结

异同点 指针  引用
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. Asp.Net WebApi一个简单的Token验证

    1.前言: WebAPI主要开放数据给手机APP,Pad,其他需要得知数据的系统,或者软件应用.Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能.我上次写的<Asp.Net MV ...

  2. 一线大厂面试官最喜欢问的15道Java多线程面试题

    前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得更多职位,那么你应该准备很多关于多线程的问题. 他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者 ...

  3. Java内存模型之原子性问题

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 前言 之前的文章中讲到,JMM是内存模型规范在Java语 ...

  4. Real World CTF一日游

    今天去感受了长亭举办的RWCTF现场,参加了技术论坛,也学到了很多的知识 比较有印象的就是 智能安全在Web防护中的探索和实践 阿里云安全防护构建的AI架构体系: 基线检测 基础过滤 异常检测 攻击识 ...

  5. 在.NET Core控制台中使用依赖注入

    本文介绍如何在控制台应用程序中使用微软提供的依赖注入功能,掌握控制台中的用法后,可以扩展到构建windows服务中. 创建控制台应用程序 添加DependencyInjection的引用 Instal ...

  6. Java连载63-异常处理try...catch...、方法getMessageyu printStackTrace

    一.处理异常的第二种方法 1.try......catch... 语法: try{ 可能出现异常的代码: }catch{ 处理异常的代码: }catch{ 注意: (1)引入了什么异常,catch里面 ...

  7. Cannot read property 'createElement' of undefined

    场景: 架构:React+TS+DVA   具体场景: 在将之前后缀为jsx的组件转化为tsx后缀的组件时,抛出Cannot read property 'createElement' of unde ...

  8. python基础之字符串讲解(下)

    7.swapspace 这个命令是让大小写翻转 s = 'qwerQ' s3 = s.swapcase() print(s3) 8.title 每个隔开(特殊字符或者数字)的单词首字母大写 s = ' ...

  9. linux源码安装mysql,shell编程学习,ubuntu

    一.mysql安装 以源码安装的方式编译和安装Mysql 5.6. 1.卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6 ...

  10. C语言程序运行时的一些细节

    本章可以看作是 <Unix 环境高级编程>Ch7 的笔记. C 程序运行的开始和结束 一个可以运行的 C 语言总要有一个 main 函数,main 函数现在的完整定义是 int main( ...