C语言基础---9.指针常量/常量指针详解--小白入门

本文深入解析C++中指针与const的结合使用,区分指针常量、常量指针及指向常量的指针常量的概念与应用场景,通过实例代码演示不同类型的指针在操作变量时的权限限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.指针常量&常量指针&指向常量的指针常量:傻傻分不清

  • const int *p 或者 int const *p
  • int * const p
  • const int * const p

第一次看到上面的表达式,感觉很懵逼。如果您是属于完全不懵逼的人,那就可以跳过下面的部分了!

指针常量:本质是常量,但是指针修饰的,既然是常量,那常量的值是无法改变的。例如,小姐姐很漂亮,重点要表达的是漂亮的特性,漂亮不能改变

常量指针:本质是指针,但是用常量修饰的指针,说明这个指针不能改变。指针的本质是指向哪块内存,所以常量指针的精髓是,这个指针的指向不能改变。例如,漂亮的小姐姐,核心是小姐姐,小姐姐不能改变

1.指针常量

指针常量:

  • p指针可变,即指针可以转向不同的变量
  • p不可变,此时不能用p来修改变量
#include<iostream>
#include<string>
using namespace std;

int main()
{
	int me = 20;
	const int* p = &me;//p可变,即指针可以转向,*p不可变,此时不能用*p来修改变量 

	cout <<"me的值为:"<<  me <<"   me的地址为:" <<  &me << endl;
	cout << "*p的值为:" << *p << "  p的值为:" << p <<  endl;
	
	int you = 50;
	p = &you;		// 改变了指针的指向
	cout << "===========================" << endl;
	cout << "you的值为:" << you << "   you的地址为:" << &you << endl;
	cout << "*p的值为:" << *p << "  p的值为:" << p << endl;

	//*p = 22;  //*p不能在为变量重新赋值了,提示:表达式必须是可修改的左值

	return 0;
}


me的值为:20   me的地址为:008FFA18
*p的值为:20  p的值为:008FFA18
===========================
you的值为:50   you的地址为:008FFA00
*p的值为:50  p的值为:008FFA00

  • 如上中,const int* p = &me ,说明指针的值已经确定了,对应的是me的值,这是相当于是常量20,所以*p不能作为左值
  • 有关左值的理解,可以浏览:https://blog.csdn.net/chenmozhe22/article/details/106123399

2.常量指针

常量指针:

  • p指针不可变,即指针不可以转向其他的变量
  • p可变,此时可以用p来修改变量的值

#include<iostream>
#include<string>
using namespace std;

int main() {

	int me = 20;
	int* const p = &me;      //p2不可变,即不能改变指向的变量;但*p2可变,此时允许*p2来修改变量的值
	cout <<"me的值为:"<<  me <<"   me的地址为:" <<  &me << endl;
	cout << "*p的值为:" << *p << "  p的值为:" << p <<  endl;

	*p = 30;
	cout << "===========================" << endl;
	cout << "me的值为:" << me << "   me的地址为:" << &me << endl;
	cout << "*p的值为:" << *p << "  p的值为:" << p << endl;

	int you = 30;
	// p = &you;   // 错误提示:表达式必须是可改变的左值


}

me的值为:20   me的地址为:012FFD08
*p的值为:20  p的值为:012FFD08
===========================
me的值为:30   me的地址为:012FFD08
*p的值为:30  p的值为:012FFD08


3.指向常量的指针常量

指向常量的指针常量:

  • p指针不可变,即指针不可以转向其他的变量
  • p不可变,此时不可以用p来修改变量的值

int main() {

	int me = 20;
	const int* const p = &me;  // p3不可变,即不能改变指向的变量;*p3也不可变,不能用*p3来修改变量的值 
	
	int you = 30;

	p = &you;		// 错误提示:表达式必须是可修改的左值
	*p = 18;        // 错误提示:表达式必须是可修改的左值

}

如完之后,还有哪里不清楚的,欢迎留言,我再补充下,争取所有人都看得懂!

指针的理解:https://blog.csdn.net/chenmozhe22/article/details/106099565
const的理解:https://blog.csdn.net/chenmozhe22/article/details/106123399

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hello-alien

您的鼓励,是我最大的支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值