C/C++ 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的一些用法,平常实际运用到,但总是分不清到底指的什么东西,只能知道是个常量。这一遍梳理下来,总归还是有些好处的。

相关推荐
wen__xvn33 分钟前
每日一题洛谷P8615 [蓝桥杯 2014 国 C] 拼接平方数c++
c++·职场和发展·蓝桥杯
刘梓谦41 分钟前
Qt获取CPU使用率及内存占用大小
开发语言·c++·qt
珊瑚里的鱼44 分钟前
第八讲 | stack和queue的使用及其模拟实现
开发语言·c++·笔记·visualstudio·stl·学习方法·visual studio
yong15858553431 小时前
[SIGPIPE 错误] 一个 Linux socket 程序,没有任何报错打印直接退出程序
linux·服务器·网络·c++
敲上瘾2 小时前
MySQL数据类型
数据库·c++·mysql·数据库开发·数据库架构
小陶来咯3 小时前
【高级IO】多路转接之单线程Reactor
服务器·网络·数据库·c++
可乐鸡翅好好吃5 小时前
not a genuine st device abort connection的问题
c语言·stm32·单片机·keil
C++实习生9 小时前
powerbuilder9.0中文版
c语言·c++
oioihoii9 小时前
C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)
开发语言·c++·c++23
Cuit小唐10 小时前
C++ 迭代器模式详解
c++·算法·迭代器模式