C语言学习难点突破专题(三)——指针常量与常量指针(1)

本文详细解析了C++中const关键字在指针变量定义中的不同用法,包括常量指针和指针常量的概念。通过实例代码,解释了const char*、char const*和char*const这三种声明方式的含义及限制,强调了const修饰的位置决定了其修饰对象的不同,帮助读者理解指针与常量的交互规则。
摘要由CSDN通过智能技术生成

在编程中,我们常常会因为一些奇怪的定义犯懵,比如接下来的一个定义

const char * const pcName;

这是什么,为什么在用const声明变量的前提下,后面的指针变量前面还有一个const,这就不得不提到指针常量和常量指针,接下来的三种变量声明方式:

const char* ptr1;
char const* ptr2;
char* const ptr3;

我们先暂且不管上面三个变量的初始化是否合理(第二种声明方式其实和第一种一样),现在我们一个一个来看着三种变量的初始化的不同。

(先简单说明const的作用:当我们需要定义一个变量,但是我们希望这个变量的值不能被改变,在整个作用域中都保持固定。这个时候就可以使用const关键字对变量加以限定;当我们用const定义常量时,必须初始化赋值,比如const int a = 100;或者const char name = ‘c’;等等

接下来再记住一个重要的口诀,我们想弄懂指针常量和常量指针,就必须搞清楚const是用来修饰谁,当const出现在*前面则const是用来修饰指针指向的对象,此时为常量指针(const *),此时指针的指向可以修改,但是指针指向的值不能修改;当const出现在*后面则const用来修饰指针变量本身,此时为指针常量(* const),此时指针的指向不可以改变,但是指针指向的值可以修改,懂了这句话,现在我们就可以

1.首先是 const char* ptr1;按照指针的定义方式,现在指针的类型为char*型,根据上面的口诀,const出现在*前面,则const用于修饰指针指向的对象,那么此时指针指向的对象是一个常量,通过以下代码验证:

void test18()//常量指针和指针常量
{
	const char num1 = 'c';
	const char* pstr1;
	pstr1 = &num1;
	printf("*pstr1=%c\n", *pstr1);
}

输出结果*pstr1=c,也就是说pstr指向的内容是常量,这是正常且正确的用法,为什么这么说呢,其实这种定义方式,指向的内容也可以不是通过const初始化的常量,如:

void test18()//常量指针和指针常量
{
	const char num1 = 'c';
	char num2;
	num2 = 'd';
	const char* pstr1;
	pstr1 = &num1;
	printf("*pstr1=%c\n", *pstr1);
	pstr1 = &num2;
	printf("*pstr1=%c\n", *pstr1);
}

此时最后输出的内容为*pstr1=d,好像和平时的指针变量没有什么区别,但是指针变量的使用有一个非常重要的用法,即使用指针变量赋值,如果pstr1是指针变量的话,我们可以通过*pstr1=‘a’的方式为pstr1所指向的内容赋值,但是由于const的修饰,使得指针指向的内容是常量,常量的值是不能改变的,也就是说不能通过“*pstr1=”的方式为指向内容赋值值,即使上面例子中所指向内容不是常量,也不能赋值。

2.接着上面的第二个定义方式,char const* pstr2;还是利用上面的口诀,const出现在*前面,则const是用于修饰指针,其实第二个定义方式使用方法和第一个定义方式完全一致,这两种定义方式中的pstr1和pstr2被称为常量指针。

3.现在是第三个定义方式,char* const pstr3;根据口诀,const出现在*的后面,则const是用来修饰指针本身,用来修饰指针本身则被我们成为指针常量,指针常量代表这个指针是一个常量,指针是什么,指针是一个地址,也就是这个地址不能改变,现在我们应该能够理解,为什么在初始化的时候,直接写char* const pstr3;会报错,因为pstr3是常量,常量在初始化的时候必须赋值,报错是因为没有赋值,接下来我们在代码中看看:

void test18()//常量指针和指针常量
{
	const char num1 = 'c';
	char num2 = 's';
	const char* pstr1;
	//char* const pstr3;//报错,因为没有给pstr3赋值
	char* const pstr3 = &num2;
	pstr1 = &num1;
	//*pstr1 = 'b';//报错,因为*pstr1在编译器中识别为常量,常量不能重新赋值
	printf("*pstr1=%c\n", *pstr1);
	printf("*pstr3=%c\n", *pstr3);
	*pstr3 = 'o';
	//pstr3 =&num1;//报错,因为pstr3是常量,常量不能重新赋值
	printf("*pstr3=%c\n", *pstr3);
}

输出结果为

*pstr1=c
*pstr3=s
*pstr3=o 

4. 回到这篇文章的开始

const char * const pcName;

上面这个定义到底是指针常量还是常量指针,其实这个是一个指向常量的常量指针

 这代表什么,代表pcName既不能通过*pcName给指向的内容重新赋值,也不能通过pcName=&..的方式指向其他内容。

以上就是全部内容,如果觉得上面内容对你有帮助的话,就帮我点个赞吧!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值