const和指针的结合

news2025/1/12 19:44:13

易错知识点

1、常量不能作为左值,防止直接修改常量的值

2、不能将常量的地址泄露给普通指针或普通引用变量,防止间接修改常量的值

// 关于易错知识点第2点
// 不能将常量的地址泄露给普通指针或普通引用变量,防止间接修改常量的值
const int a = 10;
const int * p = &a; // 正确写法!
// int * p = &a;       // 错误写法!
// int * const p = &a; // 错误写法!
	// 以下写法均正确!
	 
	int a = 1;
	
	int * p1 = &a;
	
	const int * p2 = &a;
	int const * p3 = &a;
	
	int * const p4 = &a;
	
	const int * const p5 = &a;
	int const * const p6 = &a;

const和指针的结合

1、const修饰离它最近的类型

2、注意区分const修饰的类型和const修饰的表达式:

除去const和它修饰的类型,剩余部分就是const修饰的表达式(详见以下代码段)

3、如果const右边没有指针*,那么const不参与类型

const和一级指针的结合

// 正确转换
// 1
const int *  <=  int *

// 2
int * const *  <=  int * *
// const因它右边*而参与类型
// 因此可将int * const *  <=  int * *看做是const *  <=  *
// 所以是正确转换


// 错误转换
// 1
int *  <=  const int *

// 2
int * *  <=  int * const *
// const因它右边*而参与类型
// 因此可将int * *  <=  int * const *看做是*  <=  const *
// 所以是错误转换
// const和一级指针的结合
// 巧用“除去const和它修饰的类型,剩余部分就是const修饰的表达式”技巧

// 1
const int * p;
// const int * p;与int const * p;等价
// const修饰的类型为int,修饰的表达式为*p
// *p的值不能被修改,p的值可以被修改
// 指针p可以指向其它内存,但不能通过指针p修改内存的值

// 2
int const * p;
// int const * p;与const int * p;等价
// const修饰的类型为int,修饰的表达式为*p
// *p的值不能被修改,p的值可以被修改
// 指针p可以指向其它内存,但不能通过指针p修改内存的值

// 3
int * const p;
// *不能单独作为类型,const修饰的类型为int *,修饰的表达式为p
// p的值不能被修改,*p的值可以被修改
// 可以通过指针p修改内存的值,但指针p不能指向其它内存

// 4
const int * const p;
// const int * const p;与int const * const p;等价
// const int * const p;相当于const int * p;和int * const p;的综合
// 前const修饰的类型为int,修饰的表达式为*p
// 后const修饰的类型为int *,修饰的表达式为p
// 不能通过指针p修改内存的值,指针p也不能指向其它内存

// 5
int const * const p;
// int const * const p;与const int * const p;等价
// int const * const p;相当于int const * p;和int * const p;的综合
// 前const修饰的类型为int,修饰的表达式为*p
// 后const修饰的类型为int *,修饰的表达式为p
// 不能通过指针p修改内存的值,指针p也不能指向其它内存

// 总结
// 第一类:const int * p;与int const * p;等价
// 第二类:int * const p;
// 第一类和第二类综合形成第三类:
// const int * const p;与int const * const p;等价
// const和一级指针的结合
// 关于“3、如果const右边没有指针*,那么const不参与类型”

#include<iostream>
#include<typeinfo>
using namespace std;

int main()
{
    int * p1 = nullptr;
    int * const p2 = nullptr;
    cout << "int * p1定义的p1的类型为" << typeid(p1).name() << endl;
    cout << "int * const p2定义的p2的类型为" << typeid(p2).name() << endl;
    cout << "总结:如果const右边没有指针*,那么const不参与类型" << endl;
    cout << "-------------------------------------------" << endl;

    const int * p3 = nullptr;
    cout << "const int * p3定义的p3的类型为" << typeid(p3).name() << endl;
    cout << "总结:如果const右边有指针*,那么const参与类型" << endl;

    return 0;
}

const和二级指针的结合

// 错误转换
int * *  <=  const int * *
const int * *  <=  int * *
// 关于const int * *  <=  int * *是错误转换的说明

// 例如,有如下错误代码:
int a = 1;
int * p = &a;
const int * * q = &p;
// 假如以上代码逻辑成立,
// 那么*q为指向const int类型的指针,那么可以写如下代码:
const int b = 2;
*q = &b;
// 值得注意的是,*q和p属于同一内存
// 而p是int *类型,是一个普通指针
// 这违背易错知识点第2点“不能将常量的地址泄露给普通指针或普通引用变量,防止间接修改常量的值”
// 所以const int * *  <=  int * *是错误转换
// 同理,int * *  <=  const int * *是错误转换
// const和二级指针的结合
// 巧用“除去const和它修饰的类型,剩余部分就是const修饰的表达式”技巧

// 1
const int * * q;
// const修饰的类型为int,修饰的表达式为**q
// q能被赋值
// *q能被赋值
// **q不能被赋值

// 2
int * const * q;
// *不能单独作为类型,const修饰的类型为int *,修饰的表达式为*q
// q能被赋值
// *q不能被赋值
// **q能被赋值

// 3
int * * const q;
// const修饰的类型为int * *,修饰的表达式为q
// q不能被赋值
// *q能被赋值
// **q能被赋值

// 总结
// 第一类:const int * * q;
// 第二类:int * const * q;
// 第三类:int * * const q;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/870207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spannable配合AnimationDrawable实现TextView中展示Gif图片

辣的原理解释&#xff0c;反正大家也不爱看&#xff0c;所以直接上代码了 长这样&#xff0c;下面两个图是gif&#xff0c;会动的。 package com.example.myapplication;import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable…

SpringMVC注解开发

1. 构建流程 1&#xff09;IDEA创建一个Maven项目。配置所需依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></depe…

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

MySQL数据库表的增删查改 - 进阶

一&#xff0c;数据库约束 1.1 约束对象 not null - 该列不能为空unique - 保证该列的每一行都不一样default - 规定没有给列赋值时的默认值&#xff08;自定义&#xff09;primary key - not null 和 unique 的结合&#xff0c;会给该列添加一个索引&#xff0…

StarGANv2: Diverse Image Synthesis for Multiple Domains论文解读及实现(一)

StarGAN v2: Diverse Image Synthesis for Multiple Domainsp github:https://github.com/clovaai/stargan-v2 1 模型架构 模型主要架构由四部分组成 ①Generator、②Mapping network、③Style encoder、④Discriminator Generator&#xff1a;G网络 生成模型G将输入图片x转换…

MATLAB从文件得出数据并计算吸收光谱

这一系列就是科研用的真实程序了&#xff0c;也是对自己的一个备忘录 真的收购每次都重写了 但真的文件太多了找不到啊&#xff01;&#xff01;&#xff01; 好吧是我废物 废话不多说&#xff0c;这就开始 基础的清理&#xff1a; clear clc close all 读取文件中的数据…

Telnet是什么

一.Telnet是什么 Telnet协议是TCP/IP协议家族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。 二.Telnet的作用 1.telnet就是查看某个端口是否可访问。 我们在搞开发的时候&#xff0c;经常要用的端口就是 8080。那么你可以启动服务器&#xff0c;用tel…

web会话跟踪以及JWT响应拦截机制

目录 JWT 会话跟踪 token 响应拦截器 http是无状态的&#xff0c;登录成功后&#xff0c;客户端就与服务器断开连接&#xff0c;之后再向后端发送请求时&#xff0c;后端需要知道前端是哪个用户在进行操作。 JWT Json web token (JWT), 是为了在网络应用环境间传递声明而…

Maven工程的安装配置及搭建(集成eclipse完成案例,保姆级教学)

目录 一.下载及安装及环境配置 1.下载及安装 2.环境变量的配置 3.检测是否安装成功 4.配置Maven 1.更换本地仓库 2. 配置镜像 二.集成eclipse完成案例 1.eclipse前期配置Maven 2.创建Maven工程 一.下载及安装及环境配置 1.下载及安装 下载地址&#xff1a;Maven – Down…

【Kubernetes】当K8s出现问题时,从哪些方面可以排查

前言 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kub…

VUE3组件

组件基础 {#components-basics} 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构&#xff1a; 这和我们嵌套 HTML 元素的方式类似&#xff0c;Vue 实现了自己的组件…

Mac下⬇️Git如何下载/上传远程仓库

使用终端检查电脑是否安装Git git --version 通过此文章安装Git ➡️ ​​​​​​​传送门&#x1f310; 方式1⃣️使用终端操作 1.下载——克隆远程仓库到本地 git clone [远程地址] 例&#xff1a;git clone https://gitee.com/lcannal/movie.git​ 2.编…

无感部署 - 蓝绿部署、AB测试、灰度发布

蓝绿部署 蓝绿部署&#xff08;Blue-Green Deployment&#xff09;是一种软件发布和部署的策略&#xff0c;旨在实现无缝的应用程序升级和回滚。在蓝绿部署中&#xff0c;同时存在两个环境&#xff1a;一个是当前稳定的生产环境&#xff08;蓝色环境&#xff09;&#xff0c;另…

linux 命令--查看网络端口命令

使用 netstat 检查端口 netstat 是一个命令行工具&#xff0c;可以提供有关网络连接的信息。 netstat - atulnp会显示所有端口和所有对应的程序&#xff0c;用grep管道可以过滤出想要的字段 -a &#xff1a;all&#xff0c;表示列出所有的连接&#xff0c;服务监听&#xff…

新型智慧城市整体规划建设方案[67页PPT]

导读&#xff1a;原文《优_新型智慧城市整体规划建设方案[67页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需…

【小梦C嘎嘎——启航篇】内存管理小知识~

【小梦C嘎嘎——启航篇】内存管理小知识~&#x1f60e; 前言&#x1f64c;malloc/calloc/realloc的区别&#xff1f;new 与 deletenew与delete要找好搭档才能保证万无一失 new 与 delete的内部实现细节是怎么样的呢&#xff1f;&#xff1f;&#xff1f;new 的内部实现细节dele…

Mybatis 小结

一、Mybatis 基本构成 MyBatis的整体分为基础支持层、核心处理层、接口。 1.1、基础支持层 1.1.1、数据源模块 MyBatis自身提供了相应的数据源实现&#xff0c;也提供了与第三方接口数据源集成的接口&#xff0c;这些功能都位于数据源模块之中。 1.1.2、事务管理模块 …

FPGA应用学习笔记----定点除法的gold算法流水线设计

猜一个Y0 a和b上下都Y0 分母越接近一&#xff0c;分子就越接近答案 误差&#xff1a; 下一步迭代为 Y的迭代值&#xff1a; 误差值&#xff1a; 代码的实现如上所示

GrapeCity Documents for Imaging Crack

GrapeCity Documents for Imaging Crack 增加了对双面打印的支持。 GcExcel.NET支持PrintOutOptions类中的Duplex枚举&#xff0c;以启用/禁用页面上的双面打印。 枚举中有四个选项&#xff0c;用户可以相应地使用它们来打印工作簿&#xff1a; 双面打印。Default表示打印机的默…

Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题

Codeforces Round 892 (Div. 2) C. Another Permutation Problem 源码&#xff1a; #include <iostream> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <stack> #include &l…