const的用法

server/2025/1/31 17:09:48/

文章目录

    • 一、C和C++中const修饰变量的区别
    • 二、const和一级指针的结合
      • const修饰的量常出现的错误是:
      • const和一级指针的结合
      • 总结:const和指针的类型转换公式
    • 三、const和二级指针的结合

一、C和C++中const修饰变量的区别

C++中:const必须初始化,叫常量。
C语言中:const修饰的量,可以不用初始化(但之后同样不可作为左值)。不叫常量,叫做常变量。

	const int a = 20;// int array[a] = {}; // 非法int *p = (int*)&a;*p = 30;printf("%d %d %d\n", a, *p, *(&a)); // 30 30 30

const的编译方式不同。C中,const就是当作一个变量来编译生成指令的;C++中,所有出现const常量名字的地方,都被常量的初始化替换了!

	const int a = 20;int array[a] = {}; // 合法int *p = (int*)&a;*p = 30;printf("%d %d %d\n", a, *p, *(&a)); // 20 30 20

如果改成以下,初始值不是立即数,而是一个变量,则又变为常变量。

    int b = 20;const int a = b;// int array[a] = {}; // 非法int *p = (int*)&a;*p = 30;printf("%d %d %d\n", a, *p, *(&a)); // 30 30 30

二、const和一级指针的结合

const修饰的量常出现的错误是:

  1. 常量不能再作为左值 《= 直接修改常量的值
  2. 不能把常量的地址泄露给一个普通的指针或者普通的引用变量 《= 间接修改常量的值

const和一级指针的结合

C++的语言规范:const修饰的是离它最近的类型

  • const int *p = &a;==> *p = 20非法,p = &b合法
    可以任意指向不同的int类型的内存,但是不能通过指针间接修改指向的内存的值(常量指针/底层const)
  • int const* p;==> 同const int *p
  • int *const p = &a;==> p = &b非法,*p = 20合法
    这个指针p现在是常量,不能再指向其它内存,但是可以通过指针解引用修改指向的内存的值(指针常量/顶层const)
  • const int *const p = &a;==> 前一个const修饰的是*p,后一个const修饰的是p

总结:const和指针的类型转换公式

int* <= const int* 是错误的!
const int*<= int* 是可以的!

int *q1 = nullptr;
int *const q2= nullptr; // const如果右边没有指针*的话,const是不参与类型的
cout << typeid(q1).name() << endl; // int *
cout << typeid(q2).name() << endl; // int *

三、const和二级指针的结合

const和二级指针的结合,两边必须都有const(或都没有)
int** <= const int** 是错误的!
const int** <= int** 是错误的!

int** <= int* const * 是错误的!(属于const和一级指针结合,因为此处const只修饰右边指针,相当于int* <= const int* 是错误的!)
int* const * <= int** 是可以的!(相当于const int*<= int* 是可以的!)

在这里插入图片描述

在这里插入图片描述

修改方式1:

int a = 10;
const int *p = &a; // 普通指针p无法修改
const int **q = &p;

修改方式2:

int a = 10;
int *p = &a;
const int *const*q = &p; // 禁止给*q赋值

http://www.ppmy.cn/server/163838.html

相关文章

java爬虫工具Jsoup学习

目录 前言 一、基本使用 二、爬取豆瓣电影的案例 三、Jsoup能做什么&#xff1f; 四、Jsoup相关概念 五、Jsoup获取文档 六、定位选择元素 七、获取数据 八、具体案例 前言 JSoup是一个用于处理HTML的Java库&#xff0c;它提供了一个非常方便类似于使用DOM&#xff0…

【视频+图文详解】HTML基础4-html标签的基本使用

图文教程 html标签的基本使用 无序列表 作用&#xff1a;定义一个没有顺序的列表结构 由两个标签组成&#xff1a;<ul>以及<li>&#xff08;两个标签都属于容器级标签&#xff0c;其中ul只能嵌套li标签&#xff0c;但li标签能嵌套任何标签&#xff0c;甚至ul标…

HarmonyOS简介:上架与分发

HUAWEI AppGallery Connect HUAWEI AppGallery Connect为开发者提供全球化、全场景一站式应用服务分发能力&#xff0c;并为开发者提供质量安全工程管理等领域的能力。大幅降低应用开发与运维难度&#xff0c;提升版本质量&#xff0c;帮助开发者获得用户&#xff0c;并实现收…

hadoop==docker desktop搭建hadoop

hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f

【机器学习】深入探索SVM:支持向量机的原理与应用

目录 &#x1f354; SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 &#x1f354; 小结 学习目标 知道SVM的概念 &#x1f354; SVM引入 1.1什么是SVM? 看一个故事&#xff0c;故事是这样子的&#xff1a; 在很久以前的情人节&#xf…

SAP SD学习笔记27 - 贩卖契约(框架协议)3 - 基本契约 - 定期请求(开票计划)

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…

高效学习方法分享

高效学习方法分享 引言 在信息高速发展的今天&#xff0c;学习已经成为每个人不可或缺的一部分。你是否曾感到学习的疲惫&#xff0c;信息的爆炸让你无从下手&#xff1f;今天&#xff0c;我们将探讨几种高效的学习方法&#xff0c;帮助你从中找到适合自己的学习之道。关于学…

多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新——从DeepSeek看下一代语言模型的高效之路

多头潜在注意力&#xff08;MLA&#xff09;&#xff1a;让大模型“轻装上阵”的技术革新 ——从DeepSeek看下一代语言模型的高效之路 大模型的“内存焦虑” 当ChatGPT等大语言模型&#xff08;LLM&#xff09;惊艳世界时&#xff0c;很少有人意识到它们背后隐藏的“内存焦虑”…