文章目录

  • I . 引用概念
  • II . 引用声明
  • III . 引用 地址 内存 分析
  • IV . 常引用
  • V . 引用作为参数
  • VI . 引用 与 指针 对比

I . 引用概念


C++ 对 C 扩充 : 引用 ( Reference ) 概念 , 是 C++ 在 C 的基础上进行的扩充 , 在 C 语言中是没有引用的 ;

引用本质 : 引用的本质就是为一个变量指定一个别名 , 这个别名与变量的使用方式是相同的 ;

II . 引用声明


引用声明 :

① 引用声明格式 : 类型标识符 &引用别名 = 目标变量 ;

② 示例代码 :

int a = 0;
int &b = a;

③ 引用标识 : 此处的 & 操作不是取地址运算 , 只是起一个引用标识的作用 ;

④ 类型标识符 : int 是类型标识符 , 注意引用的类型标识符要与被引用的变量相同 ;

⑤ 初始化 : 声明引用的同时 , 必须进行初始化 , 因为引用定义的是一个变量的别名 , 这个变量必须在声明的时候指定 ;

//引用相当于常量指针 , 必须在声明的时候就初始化 , 声明完毕后初始化是无效的 , 编译执行会报错
//错误示例 , 引用声明后必须马上初始化
int a = 0;
//声明的时候必须初始化 , 此时的声明时错误的
int &b;
//此时对引用进行赋值就是错误的
b = a;

⑥ 引用使用 : 引用声明后 , 该引用 b 与 a 是等价的 , 凡是可以使用 a 的地方都可以使用 b ;

注意 : 引用声明完成之后 , 不能讲该引用名称再次声明为其它变量的名称 ;

III . 引用 地址 内存 分析


int a = 0;
int &b = a;

变量 与其 引用地址相同 : 对 变量 a 和 引用 b 取地址操作 , &a 与 &b 的值是相等的 ;
( 引用名称 是 变量名称 的一个别名 )

编译器实现 : 编译器将引用实现为 int * const b 指针 , 其指针本身是常量 , 即存储的地址是不可变的 , 指针指向的内容是可变的 ;
( 既然引用是一个 指针常量 , 说明其还是需要占用内存的 )

const 修饰指针规则 : 左数 右指 (const 在 * 左边数据是常量, const 在 * 右边指针是常量);
左数 ( 常量指针 ) : const 出现在 * 左边时, 指针指向的数据为常量, 指向的数据不可改变;
右指 ( 指针常量 ) : const 出现在 * 右边时, 指针地址本身是常量, 指针地址不可改变;

指针常量 : 表示该指针本身是一个常量 ;
常量指针 : 表示指向一个常量的指针 ;

IV . 常引用


常引用 :

① 常引用简介 : 引用本身是一个常量指针 , 指针本身的地址不可改变 , 常引用 在常量指针的基础上 , 将指向的数据也设置成常量 , 即不能通过该引用修改变量的值 ;
( 引用代表的地址不能修改 <引用自带属性> , 常引用 在引用的基础上 , 指向的数据也不能修改 )

② 常引用声明格式 : const 类型标识符 &引用别名 = 目标变量 ;

③ 示例代码 :

int a = 0;
const int &b = a;

④ 等价说明 : 上述常引用 b 等价于 const * int * b , 即该常引用的引用本身 , 以及其代表的变量 , 都不能通过该引用进行修改 ;

这里注意 , 不同通过引用进行修改 , 但是可以通过变量名称 a 进行修改 ;

⑤ 作用及意义 : 使用 引用数据类型 作为 函数参数 , 如果不需要在 函数中 修改该引用变量的值 ( 指针指向的数据的值 ) , 就将该参数声明为常引用 , 这样能最大限度增加安全性 , 避免因为误操作导致不必要的问题出现 ;

V . 引用作为参数


C 语言中的参数 分类 :

① 普通变量参数 : C 语言中 普通变量 ( 非指针变量 ) 作为参数 , 只能进行值传递 , 不能通过参数返回结果 ;

② 指针变量参数 : C 语言中 , 如果要让函数的参数可以将结果返回 , 则必须使用指针作为参数 ;

C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 , 使参数具有返回结果的能力 ;

作用及意义 :

① 具有返回值能力 : 使用引用作参数 , 可以将参数当做返回值使用 ;

② 提高参数传递效率 : 大型对象作参数时 , 使用引用类型 , 可以提高参数传递效率 ;

VI . 引用 与 指针 对比


引用与指针的相同点 : 都具有地址的概念 ;

① 指针 : 指针指向内存中的一块空间 , 指针变量的内容是一个内存地址 ;

② 引用 : 引用是变量的别名 , 即某块内存空间的别名 , 相当于一个 指针常量 , 也指向一块内存空间 ;

引用与指针的不同点 :

① 引用比指针更严格 :
引用在定义时必须被初始化 , 而且只能初始化这一次 , 相当于 指针常量 ;
指针 是可变的 , 指针指向的地址 , 以及 地址中的数据 都是可变的 ;
引用的变量值内容可变 , 变量的地址不可变 ;

② 是否可以为空 : 指针可以为空 , 但是引用必须不能为空 , 因其在声明时必须进行初始化操作 ;

③ sizeof 操作区别 : sizeof ( 引用 ) 获取的是被引用的变量的大小 ( 随变量类型变化 ) , sizeof ( 指针 ) 获取的是指针变量本身的大小 ( 固定的 ) ;

④ 类型安全性 : 引用是类型安全的 , 指针类型不安全 , 引用比指针多了类型检查机制 ;

【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )相关推荐

  1. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)

    文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...

  2. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  3. 初识C语言(1)(2)(3)(4) C语言入门 保姆级教程 变量 常量 字符串 转义字符 操作符 关键字 字符串 指针 函数 结构体 数组 选择语句 循环语句

    一.如何写C语言代码 1.编译器 2.创建项目 3.创建源文件 4.写代码 5.编译+链接+运行 项目名字不要汉语,不要特殊字符,不要加空格,项目路径一般为你想要的路径 C语言中,一般创建.c源文件, ...

  4. 非常量引用的初始值必须是左值_C++核心编程--引用

    2 引用 2.1 引用的基本使用 作用: 给变量起别名 语法: 数据类型 &别名 = 原名 示例: int main() {int a = 10;int &b = a;cout < ...

  5. vue引用自定义.js文件 (常量抛出 + 地址三级联动为例)- 语法篇

    文章目录 vue如何引用`自定义封装的` `.js`文件? `如何操作,详细如下.`(注意代码注释部分:注意1/2/3/4/5) 一.效果图预览: 二.以自定义`area.min.js`文件为例: 三 ...

  6. 11深入理解C指针之---指针和常量

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为C语言的左膀右臂,使用方便,修改容易,引用数据快速都是很有前景的应用.C语言中 ...

  7. Go语言学习十二 变量和常量

    本文最初发表在我的个人博客,查看原文,获得更好的阅读体验 Go 使用var关键字声明变量:使用关键字const声明常量.变量可以像常量一样初始化. 一 变量 1.1 变量声明 语法: var 变量名 ...

  8. C语言入门教程之一变量和常量

    编译环境设置好以后,就可以正式学习C语言了. 一.变量     (一).变量类型和表示方法         1.什么是变量?一句话,变量是存储数据的值的空间.由于数值的类型有多种,有整数.小数(浮点数 ...

  9. 【C语言入门教程】2.2 常量 与 变量

    2.2 常量 与 变量 顾名思义,常量是运算中不能改变数值的数据类型,变量是可改变数值的数据类型.根据需要,可将一些在程序中不必改变数值的类型定义为常量,这样也可避免因修改数值造成程序错误.任何改变常 ...

最新文章

  1. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏
  2. python函数注释 参数 省略号_解决python 输出是省略号的问题
  3. [YTU]_2424 C语言习题 字符串比较
  4. 防止UI界面被输入法遮挡(画面随输入法自适应)
  5. flask小demo-数据查询
  6. 费城中餐馆奇葩鸡翅定价引爆网络,数万网友想要破解数学谜题
  7. Tensorflow快餐教程(4) - 矩阵
  8. flash 用 html 播放,使用flash插件在HTML上播放音频
  9. python内建函数调用,Python 内建函数
  10. 用fileupload处理文件上传
  11. spark笔记之Scala中的协变、逆变、非变
  12. ASP.NET基本对象介绍
  13. unable to find setter method for attribute:[commandName]
  14. centos journalctl日志查看
  15. SnapGene快速入门,界面及常用操作教程
  16. 删除用户账户|win7系统怎么删除用户账户
  17. web打印模板神器reportbro—汉化及中文字体配置(上)
  18. 本次技术博客平台的选择
  19. 客户体验决胜2022,低代码是快速取胜之道
  20. 电子DIY:用单片机设计一款USB游戏手柄

热门文章

  1. 后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户)
  2. 【翻译】QEMU内部机制:顶层概览
  3. Visual studio中编译和使用libpng和zlib
  4. python程序设计——函数设计与调用
  5. Unity3D研究院之Editor下监听Transform变化
  6. Android中asset和raw的区别
  7. git的常用命令总结
  8. [Flex]关于国内Flex开发者/从业者的调查问卷
  9. 推荐两个Firefox插件
  10. Storm的StreamID使用样例(版本1.0.2)