指针和引用的异同点总结

异同点 指针  引用
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. 手把手教你打造一款轻量级canvas渲染引擎

    背景 当我们开发一个canvas应用的时候,出于效率的考量,免不了要选择一个渲染引擎(比如PixiJS)或者更强大一点的游戏引擎(比如Cocos Creator.Layabox). 渲染引擎通常会有S ...

  2. Selnium IDE插件的安装与简单使用

    一.Firefox在线安装IDE插件 1.启动Firefox,点击菜单工具->附加组件,如图: 2.在附件管理页面,手动输入Selenium IDE,搜索 3.在搜索结果中点击Selenium ...

  3. kubernetes-单机实验(入门)

    一.安装kubernetes   实验环境: centos7.0(建议使用7.5版本) 实验机器IP:192.168.1.4 安装方式:yum安装 需求环境:Tomcat+Mysql   1:关闭防火 ...

  4. 【NodeJS】nvm

    [NodeJS]nvm node多版本管理 NVM_HOME=C:\env\nvm NVM_SYMLINK=C:\env\nodejs 查看版本 nvm v 查看当前使用的node版本 nvm cur ...

  5. 集群式Quartz定时任务框架实践

    在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行 ...

  6. poj 1270 Following Orders (拓扑排序+回溯)

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5473   Accepted: 2239 ...

  7. EF Core 基础知识

    数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...

  8. excel中生成32位随机id

    记录下如何在EXCEL中利用公式生成32位的随机id(无符号,只有数字和小写字母). ,,)),),"",DEC2HEX(RANDBETWEEN(,,)),),"&quo ...

  9. ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示

    场景 Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  10. Dc:7 Vulnhub Walkthrough

    靶机下载地址: https://www.vulnhub.com/entry/dc-7,356/ 主机扫描: http://10.10.202.161/ Google搜索下: SSH 登录 以上分析得出 ...