二、从C到C++(二) 引用、引用常见用途、指针和引用区别、const引用

2023-10-31

一、引用类型

   引用( & )像一个自动能被编译器逆向引用的常量型指针。它通常用于函数的参数表中和函数的返回值,但也可以独立使用。比如:int x;int r = &x;使用引用的一些规则:
  •   当引用被创建时,它必须被初始化。(指针则可以在任何时候被初始化。)
  •   一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用。(指针则可以在任何时候指向另一个对象。)
  •   不能有NULL引用。必须确保引用是和一块合法的存储单元关连。
  (1)、引用传递
  引用传递方式是在函数定义时在形参前面加上引用运算符"&"
  例如:swap(int &a,int &b);
  按值传递方式容易理解,但形参值的改变不能对实参产生影响
  地址传递方式通过形参的改变使相应的实参改变,但程序容易产生错误且难以阅读
  引用作为参数对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然
  
  (2)、返回引用的函数
  函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。注意:不能返回对局部变量的引用。
  (3)、指针和引用的区别
  •   引用访问一个变量是直接访问,而指针是间接访问。
  •   引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
  •   引用一经初始化不能再引用其它变量,而指针可以。
    应该尽可能使用引用,不得已时使用指针。
  (4)、const引用
  const引用是指向const对象的引用。例如:
const int a;
const int &b = a;//ok
int &c = 1;//error
     
    第三个例子不正确因为引用相当于const指针,必须指向const类型的对象。下一章会讲到,其实const在遇到取地址或者具有全局作用域的时候才会分配空间,所以不会为const指针类型的c分配空间,所以也就不能赋值成功了。 
   
(5)、引用的本质和内部实现
  很多书上都说引用只是变量的别名,本身并不占用内存空间。我们可以写个程序测试一下:
struct Test {
	int& a;
};
int main()
{
	printf("sizeof(Test) %d\n", sizeof(Test));
	return 0;
}

在我的机器上打印出了4,说明引用还是占用内存空间的。C++标准并没有规定引用如何实现,但是大多数编译器都实现为一个常量指针,即type& vname等价于type* const vname,即是引用本身指向不能修改,但是引用指向的内存空间的值可以修改。所以引用的大小等于指针的大小。不过从使用的角度来看,引用容易让人误以为是一个变量的别名,不占用存储空间,实际上这是编译器为了实用性做出的细节隐藏。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二、从C到C++(二) 引用、引用常见用途、指针和引用区别、const引用 的相关文章

  • 从编译器角度分析C语言中数组名和指针的区别

    数组名和指针是两个往往很容易让人们混淆的概念 很多人以为数组名就是一个指针 也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变 例如你可以写出下面这样的代码 int p p 却不能写这样的代码 int a a 那么数组名跟
  • C++ - Vector 计算 均值(mean) 和 方差(variance)

    C Vector 计算 均值 mean 和 方差 variance 代码 double sum std accumulate std begin resultSet std end resultSet 0 0 double mean sum
  • 为什么C++编译器不能支持对模板的分离式编译

    为什么C 编译器不能支持对模板的分离式编译 刘未鹏 pongba C 的罗浮宫 http blog csdn net pongba 首先 一个编译单元 translation unit 是指一个 cpp文件以及它所 include的所有 h
  • 指针字符串 与 const char * 即const * char 的详细使用讲解

    指针字符串的使用问题 一 直接定义字符串指针的使用注意事项 定义字符串指针的时候 const char 和字符串本身相同 就不会出现警告 const char char const 作用 const char p 表示的是指针p指向的数值不
  • 【c++primer第五版】第六章函数-函数基础、参数传递、返回类型、函数重载、函数指针

    目录 函数基础 局部对象 函数声明 参数传递 main 处理命令行选项 特殊用途语言特性 调试帮助 函数匹配 函数指针 函数是一个命名了的代码块 通过调用相应的函数来执行相应的代码 函数可以有0或多个参数 通常会产生一个结果 也可以重载函数
  • 单链表中求倒数第几个节点

    问题描述 在单链表中求出倒数第K个节点 要求快速 方法一 利用链表的长度 不推荐 此方法必须事先知道链表的长度 在有长度的信息链表中 此方法可行 比如我之前的链表是这样的实现 参考博文 http blog csdn net dawn aft
  • 链表相交等相关问题java - 左神算法基础课04 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天讲讲我至今碰到的最变态的链表题 问题 单链表两个单链表可能有环 可能无环 判断两个链表是否存在相交 如果有相交 返回其中一个交点 要求 时间复杂度 O m n 空
  • Go(九)指针

    目录 Go语言中的指针 1 1 指针地址和指针类型 1 2 指针取值 1 3 new和make 1 3 1 new 1 3 2 make 1 3 3 new与make的区别 区别于C C 中的指针 Go语言中的指针不能进行偏移和运算 是安全
  • dynamic_cast报错 异常

    转载请标明是引用于 http blog csdn net chenyujing1234 代码 http www rayfile com zh cn files 89459c23 7a0b 11e1 908f 0015c55db73d UnH
  • LeetCode234:回文链表

    题目描述 题目链接 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 进阶 你能否用 O n 时间复杂度和 O 1 空间复杂度解决此题 解题思路
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • C++变量声明定义

    1 extern 声明变量 在一个文件里声明以后 表示该变量要去其它文件找变量 告诉编译器 你现在编译的文件中 有一个标识符虽然没有在本文件或本文件当前位置中定义 但是它是在别的文件中或本文件其它位置定义的全局变量 你要放行 声明变量 ex
  • c#数据结构转c++指针

    C string转c char C 使用IntPtr类型接受Marshal StringToHGlobalAnsi分配的内存 string sno 12345 IntPtr strsno Marshal StringToHGlobalAns
  • STL标准模板库学习笔记三(STL哈希容器)

    关联式容器 排序 的底层实现采用的树存储结构 更确切的说是红黑树结构 无序容器 哈希 的底层实现采用的是哈希表的存储结构 基于底层实现采用了不同的数据结构 因此和关联式容器相比 无序容器具有以下 2 个特点 无序容器内部存储的键值对是无序的
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • Java中变量的作用域【Java基础】

    最近在看 Thinking in Java 想把Java基础再巩固一下 在博客上遇到的以前没注意到的知识点或者较难的知识点记录下来 与大家分享 Java中的基本类型变量的作用域为 int x 1 变量x的作用域只在大括号内 System o
  • 结构体对齐(内存对齐)

    本文转自 http www ksarea com articles 20071004 sizeof struct memory html 有的时候 在脑海中停顿了很久的 显而易见 的东西 其实根本上就是错误的 就拿下面的问题来看 struc
  • 剑指Offer 22. 链表中倒数第k个节点(Easy)/ 19. 删除链表的倒数第 N 个结点(Medium)/ ListNode调用!!!

    LeetCode 19 删除链表的倒数第 N 个结点 Medium 题目链接 题解 链表中倒数第 k 个节点 双指针 清晰图解 思路 代码 Definition for singly linked list class ListNode d
  • 深入研究C++多态(虚函数和虚继承)

    文章目录 多态的引入 虚函数表 几种常见继承关系中的类内存分布 单继承 多继承 菱形继承 总结 作者 狗子孙 链接 https www jianshu com p 02183498a2c2 来源 简书 简书著作权归作者所有 任何形式的转载都
  • 字节对齐规则和位域

    字节对齐规则 结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除 每个数据成员存储的起始位置是自身大小的整数倍 比如int在32位机为4字节 则int型成员要从4的整数倍地址开始存储 结构体总大小 也就是sizeof的结果 必须

随机推荐

  • uni-app开发微信小程序,wx.onNetworkStatusChange、uni.onNetworkStatusChange网络状态监听不生效问题

    问题描述 1 该方法只能在手机上进行验证才能生效 小程序开发工具上面不生效 2 该方法只能写在onLoad方法里面 写在mounted方法不生效 错误写法 mounted uni onNetworkStatusChange function
  • JDBC(超详细)

    1 简介 JDBC Java DataBase Connectivity java数据库连接 是一种用于执行SQL语句的Java API 可以为多种 关系数据库提供统一访问 它由一组用Java语言编写的类和接口组成 JDBC提供了一种基准
  • 图解使用mock.js获取四位数验证码

    Mock js是用来模拟产生一些虚拟的数据 可以让前端在后端接口还没有开发出来时独立开发 我们可以使用真实的url mockjs可以拦截ajax请求 返回设定好的数据 一 安装 npm install mockjs D 二 全局引入mock
  • SpringBoot 启动时自动执行代码的几种方式

    一 java自身的启动时加载方式 static代码块 static静态代码块 在类加载的时候即自动执行 构造方法 在对象初始化时执行 执行顺序在static静态代码块之后 二 Spring启动时加载方式 PostConstruct注解 Po
  • C语言初步总结

    内容比较多 大家可以复制做一个文档 然后用得时候直接搜索就好了 非常方便 不用网络也可以使用 第二周的学习总结 1 对C语言的介绍与初步认识 C语言的产生与发展 FORTRAN 1957年 ALGOL 60 1960年 传统C或K R C
  • RS485在切换收发状态的时候收到0x00

    介绍一下测试背景 我使用单片机的TTL232 通过MAX485芯片转成RS485协议 但是遇到一个问题 MAX485芯片在从发送状态切换到接收状态的时候会收到一个0x00 很显然这是一个 假 数据 并不是真实接收到的数据 这个0x00着实有
  • C++中namespace detail或namespace internal的使用

    在很多开源代码中偶尔会使用名字为 detail 或 internal 的命名空间 如OpenCV的modules目录中 有些文件中使用了namespace detail 有些文件中使用了namespace internal 名为detail
  • Ceph 存储池命令 以及 数据压缩

    文章目录 一 存储池操作 1 1 常用命令 1 2 删除存储池 1 3 存储池配额 1 4 存储池可用参数 二 存储池快照 2 1 创建快照 2 2 验证快照 2 3 回滚快照 2 4 删除快照 三 数据压缩 3 1 启用压缩并指定压缩算法
  • Oracle ——删除表中重复记录

    为了方便 假设表名为Tbl 表中有三列col1 col2 col3 其中col1 col2是主键 并且 col1 col2上加了索引重复数据删除 1 通过创建临时表 把数据先导入到一个临时表中 然后删除原表的数据 再把数据导回原表 SQL语
  • 【PBR系列三】BRDF方程及渲染方程

    本文核心知识主要参照 现代计算机图形学入门 闫令琪课程课件PPT 后续光线追踪系列知识也源于此处 一 BRDF方程 通过上一部分所有辐射度量学各种概念的定义之后 我们可以从这样一个角度理解光线的反射 如下图所示 一个点 微分面积元 在接受到
  • 怎样安装NPM离线包

    因为一些 你懂的 原因 工作环境无法直接使用npm install联网安装npm包 稍微花了点时间研究了一下 Mark下来 有机会看源码再补充 最佳方案 别浪费时间了 最好还是在网络环境下把所需的包全部安装好 再想办法搬回来 尽管可以一个一
  • VMware Workstation 在此主机上不支持嵌套虚拟化。报错一秒解决

    VMware Workstation 在此主机上不支持嵌套虚拟化 这是由于VMware与Windows11自带的Hyper V冲突所导致的 简单的解决方法是 将虚拟机设置中的CPU虚拟化取消勾选 如图所示
  • Ubuntu 安装Google浏览器

    Ubuntu自带的浏览器是火狐浏览器 使用的时候多多少少有些不方便 这里安装Googel浏览器 下载 可以到 Ubuntu chrome去下载安装包 安装 首先到下载的根目录 cd Downloads sudo dpkg i google
  • Mybatis1.2 查询所有数据

    1 2 查询所有数据 1 2 1 编写接口方法 1 2 2 编写SQL语句 1 2 3 编写测试方法 1 2 4 起别名解决上述问题 1 2 5 使用resultMap解决上述问题 1 2 6 小结 如上图所示就页面上展示的数据 而这些数据
  • http 请求头大小写的问题

    如果是默认消息头名称 消息头格式已经固定 即便输入的大小写有误 也会给你翻译成默认的写法 如果自己定义的 会自动给你翻译成小写 所以传参数的名称都用小写字母即可 否则可能取不到值 比如encryptedString会取不到值 使用encry
  • 【华为OD机试真题】最短木板长度(python)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 最短木板长度 时间限制 1s空间限制 256MB限定语言 不限 题目描述 小明有 n 块木板
  • 在windows下C++使用Native wifi API获取SSID和连接信息

    在linux下获取当前连接的信息很是轻松的 但是在windows下相对比较复杂 虽然可以考虑使用cmd命令获取网卡的信息并分析出当前连接的SSID 但是对于网络环境比较复杂的情况下其实我们同样可以使用Native wifi API获取目前的
  • linphone-android for mac编译过程记录

    本文记录linphone andoroid在mac上的编译过程 在这里做下记录 希望对大家有所帮助 如有疑问发评论即可 环境搭建 代码下载 git clone git git linphone org linphone android gi
  • 阿里云学生服务器配置及免费学生机领取攻略

    阿里云学生服务器优惠活动从云翼计划升级为开发者成长计划 现在学生服务器活动为高校学生在家实践计划 学生用户群可以免费领取阿里云学生服务器 如果购买特价服务器只需要新用户即可 不需要学生认证即可享受优惠价 阿里云百科来详细说下阿里云学生服务器
  • 二、从C到C++(二) 引用、引用常见用途、指针和引用区别、const引用

    一 引用类型 引用 像一个自动能被编译器逆向引用的常量型指针 它通常用于函数的参数表中和函数的返回值 但也可以独立使用 比如 int x int r x 使用引用的一些规则 当引用被创建时 它必须被初始化 指针则可以在任何时候被初始化 一旦