C/C++ const相关 常量指针 常指针 常指针常量 顶层底层const

文章目录

  • 前言
  • const限定符
  • 初始化
  • const引用
  • 指针和const
  • 顶层和底层const
  • 总结

前言

在看const相关内容的时候,对const的一些概念还存在部分疑惑,容易搞混,尤其是在变量声明这种情况下。
这篇博客就主要写一下const的相关。


const限定符

const主要是用来表示一种值不能被改变的变量,也就是将变量变为常量的作用。
例如 const int a=1;这时候再向a赋值,则会报错。a用const作为限定,则无法再对a进行复制。
a仅作为一个常量。

初始化

刚才是初始化的一般用法,我给变量a一个常量,同时用const作为限定符,这样就是一个基本的初始化。
下面是用变量初始化

int a=1;
const int b=a;
int c=b;

这里的初始化的写法可以得到几个结论。
变量在初始化时可以给常量赋值。
常量可以给变量赋值。

const一般只有在当前文件夹有效。


const引用

看个例子

const int a=123;
const int &b=a;
b=1;
int &c=a;

上面四条语句,1,2是正确的。第二句,用b对a进行引用,因为a是常量,所以对于a的引用,它本身也得是常量。
第三条语句是在b已经为a的引用的情况下,还对b进行赋值。这就相当于改变常量的值,所以是不对的。
第四条语句,虽然常量能给变量赋值,但是变量引用并不能绑定常量,因为我们可以通过改变变量的引用来改变变量的值。常量的特性是保持值不变,如果我们通过它的引用能改变它的值,那常量并不能算常量。


指针和const

既然有常量引用,那必然也有常量指针。

const double pi = 3.14; // pi是个常量,它的值不能改变
double * ptr = π //错误:ptr是一个普通指针
const double * cptr = π //正确:cptr可以指向一个双精度常量
(* cptr) = 42;//错误:不能给*cptr赋值

第二条语句和上面的第四条语句是一个道理。变量指针无法绑定常量。
第四条语句和上面的第3条语句同理。指向常量的指针初始化后,所指向的值无法更改。

第三条语句定义了一个指向常量的指针,这里就要带出一些比较复杂的概念
指针指向加上const,单从变量常量来说,分为指向常量的变量指针,指向变量的常指针,指向常量的常指针
也就是下面三种情况

const int * p
int * const p
const int * const p

三种情况,我自己一般是这理解的。

指向常量的变量指针
表示指针指向的对象的值是无法改变的

指向变量的常指针
表示指针所指向的地址是无法改变的,地址的值可以改变。
这里我初始化一个常指针,那么常指针指向的一个变量值,有一个地址,这个地址就定了,不会再变了。
不变的是地址,而非地址内存放的值。

指向常量的常指针
这种情况就是两个的结合体,地址定了,值也定了。
指针指向的地址是固定的,地址内的值也是定的。


顶层和底层const

指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。
用名词顶层const( top-level const)表示指针本身是个常量,而用名词底层const (low-level const)表示指针所指的对象是一个常量。

在这里插入图片描述在这里插入图片描述

简单点说就是,我本身是常量,我就是顶层。我指的对象是常量,那对应的const就是底层。


总结

这篇文章主要是梳理了一下const的一些用法,平常实际运用到,但总是分不清到底指的什么东西,只能知道是个常量。这一遍梳理下来,总归还是有些好处的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现前端实时通信(WebSocket、Socket.io等)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

架构案例分析重点

架构案例分析重点 信息系统架构架构图 层次式架构(可能考点)表现层框架设计中间层架构设计数据访问层数据访问层工厂模式的设计(一个考点) 物联网三层 云原生架构面向服务架构(SOA)SOA设计模式 嵌入式系统架构鸿蒙操作系统&#x…

[C国演义] 第十六章

第十六章 等差数列的划分最长递增子序列 等差数列的划分 力扣链接 子数组 ⇒ dp[i]的含义: yinums[i] 为结尾的所有子数组中的 等差数列数组最多的个数子数组⇒ 状态转移方程: 根据最后一个元素的构成 初始化: 涉及到 i-1, i-2 ⇒ 所以要初始化dp[0] 和 dp[1] 都初始化为 0…

【ES实战】ES主副分片数据不一致分析

ES主副分片数据不一致分析 文章目录 ES主副分片数据不一致分析问题描述问题重现问题分析修复方案 问题描述 在请求索引中的某一条数据时,时而查询有结果,时而无结果。两种情况交替出现。 问题重现 通过对问题数据的点查,确实重现了该现象 …

hdlbits系列verilog解答(或非门)-07

文章目录 wire线网类型介绍一、问题描述二、verilog源码三、仿真结果 wire线网类型介绍 wire线网类型是verilog的一种数据类型,它是一种单向的物理连线。它可以是输入也可以是输出,它与reg寄存器数据类型不同,它不能存储数据,只能…

性能优化-卡顿优化-tarce抓取及分析

性能优化(卡顿分析) 文章目录 一、抓取trace的方法1.使用systrace抓取trace2.使用atrace抓取3.使用Perfetto抓取trace 二、trace文件的分析1.快捷操作1.1 导航操作1.2 快捷操作 2.chrome trace工具分析trace文件3.Prefetto分析trace文件 一、抓取trace的…

[Leetcode] 0035. 搜索插入位置

35. 搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target …

OceanBase自动安装部署演示环境demo

OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为:Red Hat Enterprise Linux 8 64 位 下载链接:https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码:c01x 下载并安装 all-in-one 安装包 执行如下…

LabVIEW生成和打印条形码

LabVIEW生成和打印条形码 想在LabVIEW中生成条形码然后打印条形码。但是,当尝试使用任何一个打印VI来从LabVIEW打印条形码字体时,打印机中的字体是扭曲的。该如何解决这个问题? 首先,需要条形码字体。如果没有,可以从…

【题解 树形dp 拆位】 树上异或

「KDOI-06-S」树上异或 题目描述 给定一棵包含 n n n 个节点的树,第 i i i 个点有一个点权 x i x_i xi​。 对于树上的 n − 1 n-1 n−1 条边,每条边选择删除或不删除,有 2 n − 1 2^{n-1} 2n−1 种选择是否删除每条边的方案。 对于…

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目,访问路径加前缀分为两部分: (1)修改vue项目; (2)修改nginx配置; vue项目修改 需注意,我这是vue-cli3配置&#x…

npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

一、报错: npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次。 所在位置 行:1 字符: 1npm init -y~~~ CategoryInfo : ObjectNotFo…

uniapp开发h5引入第三方js(sdk)

manifest.json 应用配置 | uni-app官网 根据文档上描述需要自定义模板的场景为: 方法一: 起初以为是在原有的index.html基础上再新建一个html文件,在项目根目录建立一个template.h5.html(仿照hello-uni-app项目)&…

Linux下程序(C语言)实现对文件的复制

目标&#xff1a; 使用系统调用实现cp命令。 原理&#xff1a; 使用系统调用fopen打开文件&#xff0c;使用fgets()从文件读数据&#xff0c;使用fputs() 向文件写数据。 linux 文件 创建命令为 vi (文件名&#xff09;.c 文件源码&#xff1a; #include<stdio.h>…

【微服务保护】Sentinel 流控规则 —— 深入探索 Sentinel 的流控模式、流控效果以及对热点参数进行限流

文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言 微服务架…

【数据结构】八大排序

目录 1. 排序的概念及其作用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想 2.2.2 直接选择排序 2.2…

【LeetCode】144. 二叉树的前序遍历 [ 根结点 左子树 右子树 ]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

基于Java的人事考勤签到管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

从头开始使用 KNN 进行 KNN 和 MNIST 手写数字识别的初学者指南

一、说明 MNIST &#xff08;“修改后的国家标准与技术研究所”&#xff09;是事实上的计算机视觉“hello world”数据集。自 1999 年发布以来&#xff0c;这个经典的手写图像数据集一直作为分类算法基准测试的基础。随着新的机器学习技术的出现&#xff0c;MNIST 仍然是研究人…

[AUTOSAR][诊断管理][$11] 复位服务

文章目录 一、简介(1) 应用场景&#xff08;2&#xff09; 请求格式&#xff08;3&#xff09; 重启类型 二、示例代码(1) 11_ecu_reset.c 一、简介 ECU复位服务就是可以此诊断指令来命令ECU执行自复位&#xff0c;复位有多种形式&#xff0c;依据子功能参数来区分&#xff08…