C生万物 | 常量指针和指针常量的感性理解

举报
烽起黎明 发表于 2023/02/28 11:41:48 2023/02/28
【摘要】 常量指针是指针吗❓指针常量是常量吗❓它们有何区别,本文告诉你👈

📚引言

本文我们来说说大家很困惑的两个东西👉【常量指针】与【指针常量】

  • 首先来看看下面这段代码,首先我定义了一个变量num为10,然后又对其进行了一个赋值修改,打印出来之后就是修改之后的值【相信这是最基本的认识】
int main(void)
{
	int num = 10;
	num = 20;

	printf("num = %d\n", num);
	return 0;
}

在这里插入图片描述

  • 但若是我可以修改num值的话,别人也可以修改了,这就没有了安全性。所以我想给它加上一把锁🔒使得它无法被修改,这里介绍一种C语言中的关键字【const】,这个我在初识C语言也有说到过,若是我们在定义变量的时候在前面加上一个const做修饰,此时这个变量就会变成【常量】
  • 这个就和Java中的final关键字是一个道理,若是加上了这个关键字做修饰之后,就要在定义的时候对其进行一个初始化,并且后面不能去修改它的值
const int num = 10;
  • 可以看到,在加上const常进行修饰之后,这个变量就无法被修改了,若是有人想要去修改的话编译器就会报出警告⚠

在这里插入图片描述


以上均为引言,接下去我们来说说有关【常量指针】和【指针常量】之间的区别

✒常量指针

🔍介绍与分析

  • 上面看到,因为在定义num的时候前面加上了const常的修饰,就使得它变成了一个常量,无法被修改,在指针初阶章节,我有介绍过可以将一个指针进行解引用去修改这个指针所指向那块地址的值
int* p = #
*p = 20;
  • 可以看到,确实可以对其进行一个修改

在这里插入图片描述

  • 那此时这个num的安全性就又降低了,所以我想再做制裁🗡,使得指针也无法对其解引用进行一个修改
  • 那么又需要使用上面所说的const修饰符,也是和修饰num一个道理,只需要在前面加上一个【const】作为修饰即可
const int* p = #
  • 可以看到,此时我们通过指针解引用的方式也无法对其进行修改❌

在这里插入图片描述

  • 虽然是不可以通过指针解引用去修改这个指针所指向的值,但是可以去修改这个指针的指向,令其重新指向一个变量的地址,这是合法的
const int num = 10;
//num = 20;
int num2 = 20;

const int* p = #
//*p = 20;		//err
p = &num2;
  • 不过原理还是一样的,我们无法通过这个指针进行解引用去修改它所指向的值

在这里插入图片描述

📰小结与记忆口诀

以上所描述的就是【常量指针】,一起来总结一下:book:

  • [x] 总结:对于常量指针而言,是将*放在【const】的左边,表示的是指针所指向的内容不能通过指针来修改,但指针变量本身可修改
  • [x] 口诀:常量指针所指向的是一个常量,不能修改;但是指针本身不是常量,可以修改

✒指针常量

知道了什么是【常量指针】,接下去让我们来看看什么是【指针常量】

🔍介绍与分析

  • 刚才我们将const放在*的左边,现在我们换个地方,将它放在*的右边试试
int* const p = #
  • 此时若再去做这两步操作的时候你就会发现和【常量指针】完全不同,可以通过指针解引同去修改指向的值,但是无法再次修改指针的指向
*p = 20;		
p = &num2;		//err

在这里插入图片描述

📰小结与记忆口诀

以上所描述的就是【指针常量】,一起来总结一下:book:

  • [x] 总结:对于指针常量而言,是将*放在【const】的右边,表示的是指针变量本身的指向不能修改,但是指针指向的内容可以通过指针来修改
  • [x] 口诀:指针常量这个指针本身就是一个常量,不能修改;但是指针所指向的内容不是常量,可以修改

👉一份凉皮所引发的故事👈

可能还是有同学对它们之间的关系不太理解。没关系,我们通过一个生活中的场景来介绍一下

在这里插入图片描述

  • 现在这里有三行代码,有一个常量num指针p里面保存了它的地址,还有一个常量num2
  • 我们假设这个指针p为一个女孩,num为一个男孩,他是这个女孩的男朋友。有一天男孩陪女孩去逛街,女孩看到路边有人在卖凉皮,所以就想要男孩给他买一份凉皮吃,可是呢男孩身上只有【10块钱】,若是给女朋友买了凉皮自己就没钱用了,于是说:“不行,不给你买,凉皮有什么好吃的😕”

在这里插入图片描述

  • 于是这个时候女孩就==生气了==,就对男孩说:“一份凉皮都不舍得给我买,还算是我男朋友吗?分手!”,于是看另一个男孩还不错,就想去找另一个男孩【他身上有100块钱】
  • 于是这个时候男孩就不乐意了,好不容易追到的女朋友(不是靠钱),怎么能说分手就分手呢,不能分。此时它就做了一个动作:在这个操作符[*]的前面加上了const作为修饰符,我们来回顾一下前面的知识

在这里插入图片描述

  • [x] 这里的*p = 0就相当于是指针通过解引同让num = 0,那指的就是让男孩变得身无分文;这里的p = &num2指的就是重新修改指针p的指向,使其指向另一个值的地址。👉这就是【常量指针】

  • 此时男孩意识到事情的严重性,那个男的身上这么有钱,万一被它拐走了。想了想还是去给她买吧,一份凉皮罢了,就和女孩说:“行行行,给你买,但是你不可以换男朋友”。此时他就又做了一个动作:在这个操作符[*]的后面加上了const作为修饰符,去掉了前面的const

在这里插入图片描述

  • [x] 同理,这里的*p = 0就相当于是指针通过解引同让num = 0,那指的就是让男孩变得身无分文;这里的p = &num2指的就是重新修改指针p的指向,也就是换一个男朋友。👉这就是【指针常量】

建议广大女性读者选择第二种男朋友,若是想下面这样的,就直接分手吧

  • [*]的前后都加上了const修饰符,那么既无法通过指针去修改所指向的值,也无法修改指针的指向,虽然这使代码变得非常安全,但在还是没有这个必要╮(╯▽╰)╭
  • 要想一个男朋友连吃的都不给你买,而且还不准你换男朋友,强行霸占你🔨这种情况还是赶紧分手吧!

在这里插入图片描述

总结与提炼

最后,我们来总结一下本文所学习的内容

  • [x] 对于常量指针而言,是在[*]左边的,指针所指向的内容不能通过指针来修改,但指针变量本身可修改
  • [x] 对于指针常量而言,是在[*]右边的,指针变量本身的指向不能修改,但是指针指向的内容可以通过指针来修改

最后感谢您对本文的观看,如果学会了请给个三连哦:heart::heart::heart:

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。