const、指针、引用的关系

2023-11-12

const、指针、引用的关系

const 与指针

我们写一段代码来探究以下

int a = 10, b = 20;
int* p1 = &a;
*p1 = 100;
p1 = &b;

const int* p2 = &a;
int const* p3 = &a;

int* const p4 = &a;
const int* const p5 = &a;

在上面 const int* p2;int const* p3= &a;是等价的
const在星号的左边,我们的const修饰的是指向能力,也就是说我们可以改变p2的自身值,但是不能修改 *p2 的值;

int x = *p2;
*p2 = 100; // err 是错误的
p2 = &b; //是正确的

const在星号的右边,我们p4自身值不能改变,但是可以改变 *p4 的值

int x = *p4;
*p4 = 100; // 是正确的
p4 = &b; //err 是错误的

而p5既不能改变自身值也不可以改变 *p5 的值

我们现在看下面的代码,来探讨哪一句正确哪一句错误

int a = 10,b = 20;
const int *p = &a;    *p 不能改

int *s0 = p;    			使得 *p 可改 
const int *s1 = p;  		*p不可改
int * const s2 = p;   		*p可改 s2 不可改
const int * const s3 = p;	*p不可改 s3 不可改

我们对const int* p = &a;分析,可以看出const修饰使得 *p 不可以修改;继而分析下面的代码是否会对 *p 产生修改

首先我们可以看出我们的 s0 s1 s2 s3 都等于 p 继而 *s1 *s2 *s3 *p 都是a,我们之前提到过能力可以收缩,而不可以扩展;

  1. s0等价于p,而我们对*s0可以进行修改,继而是错误的;
  2. const修饰 *s1,所以我们无法修改 *s1,可以修改s1,继而是正确的;
  3. cosnt修饰s2,我们可以修改*s2,而不能修改s2,所以是错误的;
  4. 我们既不可以修改s4也不可以修改 *s4 ,所以是正确

我们再来看这样一段代码,这次我们将对p进行const修饰

int a = 10,b = 20;
int * const p = &a;     p不能改

int *s0 = p;			  	s0可改 *s0 == *p 可改
const int *s1 = p;		  	*s1 不可改 s1可改 
int * const s2 = p;		  	s2不可改 *s2可改
const int * const s3 = p; 	s3不可改 *s3不可改

我们对int* const p = &a;分析,这次我们的const修饰p,使得p的值不能修改,而 *p 可以修改,接着分析下面的代码

首先于上面一样, s0 s1 s2 s3 都等于 p 继而 s1 s2 s3 p 都是a

  1. s0 与 p相等,我们可以修改*p 可以修改s0,但是对p并没有进行修改,所以是正确
  2. const修饰 *s1,我们不能修改 *s1,可以修改s1,与p无关所以是正确
  3. const修饰 s2 ,我们不能修改 s2,可以修改*s2,与p无关所以是正确
  4. 这里我们同样既不可以修改 s3,也不可以修改 *s3,同样与p无关,所以是正确

如果我们通过强制转换使得通过常量地址改变该值

int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int*)&a;
	
	*p = 100;
	b = a;
	cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl;
}

对于c++,我们产生的结果为a=10,b=10,*p=100,对于b=a,依旧给b赋值的是10
在这里插入图片描述
造成这样的原因实际上是因为C++编译会将常量a进行数值替换,继而b=a变成了b=10,C++对于常变量当作常量
在这里插入图片描述
当使用c语言编译这段代码

int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int*)&a;
	
	*p = 100;
	b = a;
	printf("a=%d b=%d *p=%d\n",a,b,*p);
	return 0;
}

得到的值为a=100,b=100,*p=100

const 与引用

我们写一段代码来看看const 与引用的关系

int a = 10,b = 20;
int *p = &a;
int *s = p;

int *&pref = p;  //给p起了一个别命pref
int &*pref = p;  //错误!!! 

在这里插入图片描述
int &*pref = p;是错误的,该代码是一个指针指向的是一个引用,是不允许编译通过的,因为在语法规则上引用不具有地址,即使引用可以进行取地址,但是是不容许这样做的,也就是我们可以定义一个引用去引用指针,而不能定义一个指针去指向引用

const 与指针、引用

我们在写一段代码详细探讨

int a = 10;
int *s = &a;

int *&p1 = s;
const int *&p2 = p;
int * const &p3 = p;
int * & const p4 = p;

在这里插入图片描述

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

const、指针、引用的关系 的相关文章

  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的

随机推荐

  • 关于vuepress打包之后页面样式丢失问题两种解决方案

    问题描述 最近打算使用vuepress为公司项目集成一下前端开发文档 在打包的时候遇到了样式丢失的问题 在网络上参考了一些解决方案 记录一下自己遇到的问题 有什么不足的地方多多指教 集成打包之后 打开入口文件展示页面如下 在本地直接运行的页
  • Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 管理员角色包含以下功能 管理员登录 管理员管理 管理商城会员 新闻公告管理 眼睛类型管理 城市信息管理 连锁配镜店管理 眼镜商品管理 用户订单管理 管理用户的评价信息等功能 用户角色包含以下功
  • 蓝桥杯2013年第四届真题-公式求值

    题目描述 输入n m k 输出下面公式的值 其中C n m是组合数 表示在n个人的集合中选出m个人组成一个集合的方案数 组合数的计算公式如下 输入格式 输入的第一行包含一个整数n 第二行包含一个整数m 第三行包含一个整数k 数据规模和约定
  • 通过H5(浏览器/WebView/其他)唤起本地app

    前两天接到一个无线的需求 我这个小白可是忙活了好几天 在页面上有一个连接 如果用户安装了APP 则点击打开对应的APP如果用户没有安装 则点击打开对应的设置连接 上网搜索了一下 基本都说可以实现 但是实际情况却不乐观 当然只是其中的一个需求
  • Http的body变空格的问题解决方案

    最近在做iOS的内购功能 需要把内购的凭证转化为base64传给服务器 服务器再去AppStore的接口进行二次验证 这中间有一个问题是base64编码的字符串里有 号 这样的字符 传到服务器上 号 字符就变成空格字符了 原因是我们在进行h
  • 建设数据仓库的八个步骤

    摘要 建立数据仓库是一个解决企业问题的过程 业务人员往往不懂如何建立和使用数据仓库 发挥其决策支持的作用 信息部门的人员往往又不懂业务 不知道应该建立哪些决策主题 关键词 数据仓库 元数据 建设数据仓库 建立数据仓库是一个解决企业问题的过程
  • Windows下搭建FTP服务器

    一 什么是ftp FTP 是File Transfer Protocol 文件传输协议 的英文简称 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 它也是一个应用程序 Application 基于不同的操作系统有不
  • 课程笔记1

    一 密码学原理 1 密码学中的哈希函数被称为cryptographic hash function 它具有三点性质 1 哈希碰撞 collision resistance 对于不相等的x和y 对应的哈希值H x H y 没有有效的办法人为地
  • VMWare Fusion虚拟机安装与配置教程

    很多时候 我们都有用虚拟机的需求 比如用着Mac突然有一个软件只支持Windows 并且还需要与macOS上的软件搭配使用 况且你没有Windows电脑 这个时候虚拟机就能帮上大忙 在macOS上 笔者用的是MacBook Air 所以这里
  • 刷脸支付不需要媒介将进一步推动消费升级

    从现金 银行卡 到现在的手机支付移动支付 支付媒介不断发生变化 并最终以手机这样的通用媒介代替了现金 银行卡这样的专用媒介 同时也是一个逐渐脱媒的过程 现在支付宝主推的刷脸支付则相当于在用户端完全不再需要媒介 这也将进一步推动消费升级 4月
  • Vue中如何定义一个全局变量(Trick)

    img class lazyload lazybanner 页面中图片使用懒加载 默认图片想通过全局变量实现 实现方案 Vue filter default img function str return 你的图片路径 img class
  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负
  • mongo 复制一个表的数据到另一个表中

    club表 id ObjectId 592e94fee820cc1813f0b9a2 id 1 name test club preload 表 id ObjectId 592e94fee820cc1813f07383 club id 1
  • 使用python爬取英雄联盟官方英雄皮肤图片

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可
  • EA使用教程

    文章目录 创建新工程 属性设置 导出图片到剪切板 时序图中取消消息后面自动生成的括号 在文本框中回车 取消流程图的背景渐变 导出更清晰图片 组合片段 设置字体和字体大小 官方教程地址 https sparxsystems cn enterp
  • 详解C#中的反射

    反射 Reflection 2008年01月02日 星期三 11 21 两个现实中的例子 1 B超 大家体检的时候大概都做过B超吧 B超可以透过肚皮探测到你内脏的生理情况 这是如何做到的呢 B超是B型超声波 它可以透过肚皮通过向你体内发射B
  • Web开发中的AJAX技术介绍

    读音 e j ks AJAX即 Asynchronous JavaScript and XML 异步JavaScript和XML AJAX并非缩写词 而是由Jesse James Gaiiett创造的名词 是指一种创建交互式网页应用的网页开
  • 软件大厂,环境检测思路和规避思路,安卓改机应该改什么数据和参数,安卓boot内核修改 环境检测对抗 部分参数解析

    前言 现在大厂的设备指纹层出不穷 但是想要确保稳定性和唯一性高精准其实也挺难的一件事 有的是通过设备信息比重进行的设备ID唯一值确认 比如A设备信息占比10 B设备信息占比20 当比重超过60 以上 设备指纹才会发生变化 这样的好处就是当你
  • Mybatis学习笔记--2:CRUD操作与动态代理

    增删改查对应Mapper配置文件里的标签 select update delete insert 1 封装MyBatisUtils工具类 public class MybatisUtils public static final SqlSe
  • const、指针、引用的关系

    const 指针 引用的关系 const 与指针 const 与引用 const 与指针 引用 const 与指针 我们写一段代码来探究以下 int a 10 b 20 int p1 a p1 100 p1 b const int p2 a