const的用法

文章目录

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

C++中:const必须初始化,叫常量。

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

c 复制代码
	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常量名字的地方,都被常量的初始化替换了!

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

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

c++ 复制代码
    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* 是可以的!

c++ 复制代码
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:

c++ 复制代码
int a = 10;
const int *p = &a; // 普通指针p无法修改
const int **q = &p;

修改方式2:

c++ 复制代码
int a = 10;
int *p = &a;
const int *const*q = &p; // 禁止给*q赋值
相关推荐
同勉共进1 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋1 小时前
C ++ [ hello world ]
c语言·c++·算法
天空'之城2 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
王维同学5 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
Scott9999HH6 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
脱胎换骨-军哥7 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
天空'之城7 小时前
C 语言工业级通用组件手写 06:固定块内存池
c语言·嵌入式开发·内存池·底层优化
旖-旎8 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
十月的皮皮8 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
Echo缘9 小时前
嵌入式系统C语言资源分类与内存分布分析
c语言·开发语言