IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 522-C++入门(const与一二级指针的结合应用) -> 正文阅读

[C++知识库]522-C++入门(const与一二级指针的结合应用)

const的初步认识

const怎么理解?
const修饰的变量不能够再作为左值!!!
初始化完成后,值不能被修改!!!
在这里插入图片描述
图示b=30;语句错误。因为const修饰b的值为20,之后,b的值就不能被修改了!

C和C++中const的区别是什么?

我们在C文件中使用const
在C语言,把const修饰的量和普通的量都是变量只是const修饰的变量不能作为左值。
在这里插入图片描述
下面这个数组写法是错误的,因为a不是常量,是常变量,不能作为常量表达式来使用。
在这里插入图片描述
在这里插入图片描述
我们把a的类型强转一下
在这里插入图片描述
指针p指向的是a的内存,const只是语法上保证修饰的量a不能作为左值,但是内存是可以修改的,通过指针就可以修改了。可以通过插入汇编指令去修改a的内存。在这里插入图片描述
在这里插入图片描述
a的内存的值已经被改为30了。
在C语言中,a是常变量!!!
我们现在来去看看C++中的const
在C++中,对于const修饰的量是必须要进行初始化的。
在这里插入图片描述
在这里插入图片描述
可以作为数组的下标哦!
我们把a进行强转
在这里插入图片描述
在这里插入图片描述
可以发现,打印出来的值和在C文件中打印出来的值不一样。

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

在这里插入图片描述
是用20在定义数组的长度。
在这里插入图片描述
*p把a的内存的值改为30了,但是编译器在编译时是把常量a都用20替换了,和a的内存就没有关系了。

在这里插入图片描述
用变量初始化a,变量的值是多少只有在运行的时候才知道,可以认为,a的地方都用变量b来替换了。
在这里插入图片描述
在这里插入图片描述
此时的a已经相当于变成C语言中的常变量。

const与一级指针的结合应用

我们以后给空指针都是用nullptr。因为NULL是空指针或者0值。
const修饰的量 叫常量
普通变量的区别是什么? C++有两点区别?1.编译方式不同 2.不能作为左值了
C++中const修饰的量常出现的错误是:
1.常量不能再作为左值 =》不能直接修改常量的值
2.不能把常量的地址泄露给一个普通的指针或者普通的引用变量 =》不可以间接修改常量的值
这2点是编译器可以检测出来报错的。
在这里插入图片描述
在这里插入图片描述
那怎么转换呢?

const和一级指针的结合:有两种情况

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

const int *p = &a;

const修饰的就是int了,因为int本身就可以组成一个类型。
但是我们关心的是const修饰什么表达式。什么表达式不能再被赋值了。
我们把修饰的类型去掉,就是const修饰的表达式了:*p
*p就不能被赋值了。
*p被const修饰了,const修饰了指针p的指向,指向的东西不能被赋值了。

p=&b

但是指针本身可以被赋值,p本身没有被const修饰。
可以任意指向不同的int类型的内存,但是不能通过指针间接修改指向的内存的值。

int const* p;

const修饰的是离它最近的类型,但是*不是类型哦,不能用 * 定义变量所以修饰的还是int。

int *const p = &a; 

这个const修饰的是int *了,因为 * 自己不能作为类型,所以再往前走,就是int *了
去掉const修饰的类型,就是const修饰的表达式,就是p本身了,p本身是常量,不能被修改,但是 *p没有被const修饰,可以修改。
这个指针p现在是常量,不能再指向其它内存,但是可以通过指针解引用修改指向的内存的值

const int *const p = &a;

前面的const修饰的类型是int,所以const修饰的表达式是*p,*p不能被赋值。
后面的const修饰的是p,p不能被赋值。

在这里插入图片描述
这样*p就不能被解引用了。

下面几种写法都可以指向a
在这里插入图片描述
我们看这个是什么情况?
在这里插入图片描述
我们先来看下面:
在这里插入图片描述
在这里插入图片描述
const如果右边没有指针*的话,const是不参与类型的!!!
const只表示q2是常量
在这里插入图片描述

总结const和指针的类型转换公式:
左值    =   右值 
int*    =    const int*    是错误的!
const int*  =   int*       是可以的!

在这里插入图片描述
Int *q=p是错误的。const int * 不能赋值给int *

const与二级指针的结合应用

在这里插入图片描述

左边的类型是const **,右边的类型是int **

这个类型转换是正确还是错误的???
在这里插入图片描述
我们现在看这个二级指针q,它的表达式组成就这3种:
q(表示本身的值)
*q(表示它所指向的一级指针p的值)
**q(表示它所指向的一级指针指向的变量a的值)

const和二级指针的结合:(3种情况)

在这里插入图片描述
第一种,const修饰的是int类型,所以**q不能被赋值,但是* q可以被修改赋值,q本身也可以被赋值。
第二种,const修饰的是int * 类型,所以 * q不能被赋值,但是q和 **q可以被赋值。
第三种,const修饰的是int * * 类型,所以q不能被赋值,但是*q和 **q可以被赋值。

总结const和指针的类型转换公式:
左值    =   右值 
int*    =    const int*    是错误的!
const int*  =   int*       是可以的!

int**  =  const int**        是错误的!
const int**  =  int**        是错误的!

int**  =  int*const*(const和一级指针的结合) 是错误的!
int*const*  =  int**         是可以的!(*转成const*是可以的)

p和*q都是访问一级指针的内存。
在这里插入图片描述
整型常量的地址是可以赋值给 *q的。
在这里插入图片描述

相当于把这个整型地址放到普通的一级指针变量里面。
但是常量的地址赋值给普通的指针p(因为p和*q等价)了,这是不行的。

怎么改呢???
在这里插入图片描述
*p不能被赋值了。就可以了。
还有一种方法:

在这里插入图片描述
让*q不能赋值。

总结应用

在这里插入图片描述
A错误,因为
在这里插入图片描述
B正确。
在这里插入图片描述
C正确。 const不参与类型。都是int*
D正确。
在这里插入图片描述
在这里插入图片描述
A错误。 把常量的地址给普通的指针了。
在这里插入图片描述
B正确。
在这里插入图片描述
C正确。
在这里插入图片描述
D错误。
在这里插入图片描述
在这里插入图片描述
E错误。
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:29:29  更:2021-09-08 10:30:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:37:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码