C++57个入门知识点_03_ const指针(const TYPE*/TYPE const* 指针指向的内容无法改变,指针本身值可以修改、const_cast专门用于去除const修饰)

本文详细介绍了C++中的const指针用法,包括const修饰指针的不同形式及其含义,如const TYPE*、TYPE const*、TYPE* const和TYPE const* const。通过示例代码展示了const指针对内容的只读约束,并讨论了如何使用const_cast去除const修饰,以实现对常量的修改。同时强调了const_cast在特定情况下的使用及其与类型强转的区别。
摘要由CSDN通过智能技术生成

接上篇:C++57个入门知识点_02_const常量限制(解决C中define无法指明数据类型问题、常量一旦定义生命周期内不可修改、编译器在程序编译时期做的检查、编译时不确定的,才可以通过指针修改运行时的值),本篇介绍const很常见的应用,修饰指针时会对指针带来什么影响以及如何去除const修饰?
总结放于前:
1. const指针性质
(1)const指针书写形式:const TYPE*/TYPE const* 指针指向的内容时无法改变的,指针本身的值是可以修改的
(2)TYPE* const表示该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容是可以修改的
(3)TYPE const* const表示指针指向的内容及指针本身均不能改变

2. 转换运算符const_cast专门用于去除const修饰

黑马总结:

	const int *p;  //const修饰*p

		可以修改 p

		不可以修改 *p。

	int const *p;  //const修饰*p

		同上。

	int * const p;

		可以修改 *p

		不可以修改 p。

	const int *const p;

		不可以修改 p。

		不可以修改 *p。

	总结:const 向右修饰,被修饰的部分即为只读。


	常用:在函数形参内,用来限制指针所对应的内存空间为只读。-防止常量被修改

1. const指针

首先看一段代码:这一段代码看上去是没啥问题,但是编译器会报错

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	char* p = "Hello world";
	p[0] = 'a';
	return 0;
}

报错结果如下:因为编译器中"Hello world"被看做常量,被放到一个只能读不能写的内存中,const char*不能转换为char*
在这里插入图片描述

1.1 const TYPE*写法

为了避免在程序编写中犯上面的错误,使用const 修饰char*,明确其指向的是常量,此时再看结果。

#include <iostream>
int main(int nArgc, char* pArgv[])
{
	const char* p = "Hello world";
	p[0] = 'a';
	return 0;
}

运行结果:由于常量可读不可写,因此无法修改
在这里插入图片描述

1.2 TYPE const* 写法


const用来修饰指针还有另外一种写法: char const* p 2= "Hello world";

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	const char* p = "Hello world";
	char const*p2 = "Hello world";

	p[0] = 'a';
	p[2] = 'b';
	return 0;
}

结果与上一致:
在这里插入图片描述

这两种写法有什么性质呢?
const TYPE*/TYPE const* 指针指向的内容时无法改变的,指针本身的值是可以修改的

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	const char* p = "Hello world";
	char const*p2 = "Hello world";

	char* p3=nullptr;
	p = p3 ;

	return 0;
}

运行结果:
在这里插入图片描述

1.3 TYPE* const的性质

TYPE* const表示该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容是可以修改的(TYPE* 修饰指针指向的内容的数据类型为TYPEconst是用来修饰指针的)

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	char szBuf[256] = "Hello world";
	char* const p = szBuf;
	p[0] = 'A';

	p = nullptr;

	return 0;
}

运行结果:
在这里插入图片描述

1.4 TYPE const* 性质

C++57个入门知识点_40 常成员函数(用于定义不可修改类内部成员变量的函数,一般用来修饰Get函数;常成员函数this指针:const T* const;常成员函数内部变量修改方法:强转/关键字)中会用到。

TYPE const* const表示指针指向的内容及指针本身均不能改变(TYPE const* 修饰指针指向的内容,const修饰指针)。

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	char szBuf[256] = "Hello world";
	char const* const p = szBuf;
	p[0] = 'A';

	p = nullptr;

	return 0;
}

运行结果:
在这里插入图片描述

2. 转换运算符const_cast

以下代码中由于p为int*类型,&n为const int 两者是无法转换的

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	const int n = 5;
	int* p = &n;

	return 0;
}

运行结果:
在这里插入图片描述
解决上面问题的一种方式是强转:

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	const int n = 5;
	int* p = (int*)&n;

	return 0;
}

另外一种方法是使用转换运算符const_cast去除const属性:

#include <iostream>

int main(int nArgc, char* pArgv[])
{
	const int n = 5;
	int* p4 = const_cast<int*>(&n);
	*p4 = 1;

	return 0;
}

强转和使用转换运算符const_cast有什么区别呢?
强转可以转换为任意类型,const_cast是只能转换const修饰的常量,语义更加明显

3. 学习视频地址:C++57个入门知识点_03_ const指针

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值