c语言:深度刨析const关键字

const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。另外CONST在其它编程语言中也有出现,例如Pascal、C++、PHP5、B#.net、HC08 C、C#等。

1.定义

const修饰的类型是指向类型,常类型的变量或对象的值是不能被更新的。

2.目的

const关键字推出的初始目的,是为了取代预编译指令,消除它的缺点同时继承预编译指令的优点。

3.作用

1.可以定义const常量,具有不可变性
2.便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
3.可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
4.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
5.可以节省空间,避免不必要的内存分配。
6. 提高了效率

3.1const修饰变量

平时我们写了一个整型变量a,我们可以通过赋值来改变a所对应的值,如果我们在它的前面加一个const结果会怎么样呢?

在这里插入图片描述
在这里插入图片描述
像这样,在对const修饰变量进行赋值的时候会报错。
所以我们可以得出一个结论:const修饰的变量,不能直接被修改。
但是想要修改变量的值也不是毫无办法的,我们可以通过指针的方式简介修改变量a

#include<stdio.h>

int main()
{
	const int a = 0;
	int* p = &a;//定义指针变量p来存放a的地址
	printf("改变之前:%d\n", a);
	*p = 20;//通过解引用的方式给a赋值
	printf("改变之后:%d\n", a);
	return 0;
}

在这里插入图片描述
这便说明const变量是可以被间接修改的。

那么const这个关键字有什么用吗?

作用:

  1. 让编译器进行修改式检查(语法检测作用)。
    2.告诉代码阅读者这个变量不要改,也属于一种”自描述含义“。(在语法层面上的较为弱性的约束作用)。

那么const修饰的变量能否作为数组的一部分?
在这里插入图片描述
结论:const修饰的变量不能作为数组的一部分。

3.2const修饰数组

const修饰数组,和const修饰常量相同,数组元素无法进行二次赋值,让我们看一段代码:
在这里插入图片描述
当我们定义一个const修饰的数组,对它进行二次赋值时,编译程序,发生报错。

int const a[5] = { 1, 2, 3, 4, 5};
count int a[5] = { 1, 2, 3, 4, 5};
//这两个数组其实本质上并没有什么区别。
//const 无论放在 int 左边右边其实都是可以的。
//但是我们一般习惯把 const 放在左边。

3.3const修饰指针

首先我们来了解一下指针和指针变量的区别:
1.指针就是地址。
2.指针变量是用来保存地址。

在这里插入图片描述

常量指针:
不能通过指针修改指针所指向的变量的值。但是指针可以指向别的变量。

在这里插入图片描述

指向常量的指针(指针常量):
指针常量的值不能被修改,即不能存一个新的地址,不能指向别的变量。但是可以通过指针修改它所指向的变量的值。
在这里插入图片描述
这里我们举一个比较俗的例子加深理解:
假如p是女孩,m是男孩1,n是男孩2,现在男孩1有10块钱,男孩2有100块钱,女孩是男孩1的女朋友,所以有int *p = &m;可是男孩1不想让女孩花自己的钱,所以他int const *p = &m;这样女孩就不能花男孩的钱使 *p = 0了;女孩p觉得男孩1太扣,所以和男孩1分手了,选择男孩2当自己的女朋友,所以有p = &n;这样是可以的。
在这里插入图片描述
这个时候男孩1又慌了,说你换男朋友那不行,所以他就int * const p = &m;这样他允许女孩花他的钱 * p = 0;但是不能换男朋友p = &n;
在这里插入图片描述
突然有一天,男孩1又有了一个想法:int const * const p = &m;这个时候这个女孩既不能花钱,也不能换男朋友了。
在这里插入图片描述
如果大家还是不懂的话,可以去b站看一下比特鹏哥对这部分知识的讲解:链接: 比特鹏哥讲const修饰指针通俗理解的例子
在90P的46:56的时间处,大家可以跳至进行学习!

3.4const修饰函数

3.4.1.const修饰函数形参

const 修饰符也可以修饰函数的参数,当不希望这个参数值在函数体内被意外改变时可以使用const 来修饰。

const int fun(const int a)const;
#include<stdio.h>

void fun(const int* p)//加上const修饰表示a不能直接被改变
{
	printf("%d\n", *p);
	*p = 20;//报错,因为const修饰a无法直接被改变
}

int main()
{
	int a = 0;
	int* p = &a;

	fun(p);//调用函数
	return 0;
}

在这里插入图片描述

3.4.2.const 修饰返回值

const 修饰符也可以修饰函数的返回值,返回值不可以被改变。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

摸鱼王胖嘟嘟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值