【C语言】const 关键字

159 阅读9分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

👋『大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流>』
✔「life motto」⇢ 种一棵树最好是十年前⇿其次是现在👌
📝<juejin>个人主页謓泽 的个人主页 - 文章 - 掘金 (juejin.cn)
📚<系列专栏>⇥C语言关键字🍻 - 謓泽的专栏 - 掘金 (juejin.cn)
🏆2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

⛳⛳⛳这是一个全新的专栏系列围绕着C语言当中关键字进行详细深度讲解,保证小白看了也能看的懂哟🌊🌊🌊

⑤ const ⇿ 修饰

描述 ⇨ 有时候我们会想定义一个不能被修改的变量。那么举个例子吧(生活当中的一些依据)有些数据是可变的比如我们的年龄、工资等...那么有些数据是不能变的,你的亲生父母、血型等等...那么如果我们要用C语言描述的话就有这两个知识点常量const 和变量了。

常量:不能被改变的量
变量:可以被改变的量
1、整形常量(八进制、十进制、十六进制)注意:八进制中个位不能超过7,十六进制不能超过F,F表示15
2、浮点常量(1.21.01e-001)
3、字符常量('a''\n''\017''\0xf')

作用 ⇨ 如果一个变量被 const 修饰,那么它的值就不能再被改变被赋值为"只读"属性。

注意 ⇨ 在数组当中的下标我们是不能使用 const 修饰的量的,可以说被修饰 const 其实本质还是个变量。

const dobule PAL = 3.14159;    //正确的声明方式
const int MYLIST;              //错误的声明方式

🍊注意⇢在用const对其变量进行修饰我们必须要对其进行初始化。

如下代码所示👇

简介→那么我们把变量 i 修饰成 const 类型的形式。然后把变量 i 的值进行改变看下程序的运行结果会发生什么。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	const int i = 1;
	printf("%d\n", i);
	i = 10;
	return 0;
}

运行结果 🖊
📝代码说明-在上述代码当中就可以说明从这里就可以说明定义const类型的变量是不能直接被修改的,不能进行二次赋值。 

那么我们在举出一个代码的例子来看看是有关于const类型修饰数组下标的内容。

#include <stdio.h>
int main(void)
{
	const int num = 5;
	int arr[num] = { 0 };
	return 0;
}

运行结果🖊

错误表达式必须含有常量值。

证明了常属性—常属性就是不能被改变的属性,但是其实它的本质上还是变量。

所以我们数组的下标当中也必须要是常量虽说const它可以修饰常量,但是它实际上还是一个变量这个是我们要注意的。

🍎注→在上述代码当中用gcc的编译器上它是可以编译过去的,这种在Windows平台下大多数都是编译不了的,但是在Linux平台下都是可以编译过去的。

🍏拓展知识点→原因是在不同的编译器下对于C语言的支持标准都是不一样的。有的是基于支持标准C语言并且是可以在特定的平台下做扩展的。所以我们需要尽可能地保证使用标准C语言在这样子跨平台就显现出来它的好处了。

🍯重点→具有跨平台性。

🍊间接赋值

说明⇢在const修饰的变量不可以直接被修改的,但是可以通过指针的方式进行间接修改。

示例代码如下↓

#include <stdio.h>
int main(void)
{
	const int i = 10;
	int* p = (int*)&i;//强转同一类型
	printf("i1 = %d\n", i);
	*p = 20;
	printf("i2 = %d\n", i);
	return 0;
}

运行结果🖊

i1 = 10

i2 = 20

🍏注⇢在上述代码的第四行当中我们是需要强制转换成与int* p同一类型整形指针的,不然编译器会发生warning(警告)

🍅被const变量修饰的意义→其实很简单就是我这个程序员不想修改这个变量,一旦我不小心进行了修改的话编译器会告诉我修改了这个变量。还有的话就是当我这个代码给别人的时候我用const进行修饰的时候当它改变我这个变量的时候就知道我在编写程序的时候实际上是我是不想修改这个变量的值的我设置为只读属性。

📒 [const]修饰数组→在C语言中const还可以修饰数组,示例代码如下↓

const int Array[] = {1,2,3,4,5,6,7,8,9,10};
int const Array[] = {1,2,3,4,5,6,7,8,9,10};

const关键字修饰数组与修饰变量类似的,表名了此数组只能具有只读性,不可以被修改。如若我们一旦修改的话程序就会报错。如下例子所示↓

Array[0] = 'A';

运行结果🖊则程序会报错(左值指定的是const修饰的对象) 

🧊第一种→[const]修饰指针

当你理解指针的时候就是可以把指针理解成地址的,说白了就是指针就是地址地址就是指针,指针变量说白了就是用来可以存储地址的。指针是一个地址,指针变量是一个变量。

C语言当中const修饰指针需要特别注意以下二点如下↓

⒈用来限定指向空间的值是不可修改的。

⒉限定指针式不可修改的。

示例代码如下↓

#include<stdio.h>
int main(void)
{
	int i = 5;
	int j = 10;
	const int* p1 = &i;
	printf("第一种:%d\n", *p1);
	//*p1 = 30;
	//错误,左值指定const对象,用const修饰(*)p1指向变量是不能修改的也就是取地址i。
	p1 = &j;
	//p1的值是可以改变的因为本质上p1只是一个变量,所以 p1=&j.
	printf("第二种:%d\n", *p1);
	printf("j:%d\n",j);
	printf("i:%d\n", i);
	return 0;
}

运行结果🖊

第一种:5

第二种:10

j:10

i:5

如果我们在第八行添加这个代码的时候如下代码所示。

*p1 = 30;

运行结果🖊

错误,左值指定 const 对象,指向空间的值是不能修改的也就是取地址i

📝拓展知识点⇢任何一根变量名在不同的应用场景当中,代表不同的含义。示例代码如下↓

int x = 1;
int y = x;

第一个x是:x的空间,变量的属性,左值。

第二个x是:x的内容,数据的属性,右值。

🍀 const 修饰指针四种情况

🍎注→在上述代码当中我们已经讲述了第一种情况解析来我们再来说说 const 修饰指针的另外的三种情况如下↓

🧊第二种→[const]修饰指针

int a = 10;
int const *p = &a;
*p = 20;
p = 100;

📝说明→第二种的这种和第一种的修饰是一模一样的,p指向的变量是不可以直接被修改的。不过一般情况下都是把类型放在前面这样更加符合它的语义。

🧊第三种→[const]修饰指针

int a = 10;
int * const p = &a;
*p = 20;
p = 100;

📝说明→在上述这个代码的const修饰的是p变量,前面(int *)代表的是类型。这里代表的是p的内容是不可被直接修改的,指针变量(*p)指向的内容是变量(a)是可以被进行修改的。

🧊第四种→[const]修饰指针

int a = 10;
const int * const p = &a;
*p = 20;
p = 100;

📝说明→第一个const修饰的是*代表p指向的变量是不可以直接被修改的。第二个const修饰的是p变量代表的是p的内容是不可被直接修改的。

总结如下↓

⒈const修饰的(*)代表的是指向的值是不可被修改的,变量可以被修改。

⒉const修饰的是变量p代表的是变量是不可被修改的,指向的值是可以被修改。

🌺 const 修饰函数参数

在const修饰符也可以修饰函数当中的参数,当不希望这个参数值在函数体内被意外修改的时候进行使用。如下代码所示↓

#include<stdio.h>
void show(const int* p)
{
	printf("*p = %d\n", *p);
}
int main()
{
	int a = 20;
	int* p = &a;
	show(p);
}

说明→在上述代码当中函数的形参用const修饰了指针(*)说明了我们不想改变变量(p)所指向变量(a)的地址。这种被称之为预防性编程的一个概念。

🍏拓展知识点⇢在C语言当中任何函数都一定要形成临时变量包括指针变量。

🍊 const 修饰函数返回值

用一个代码例子来讲述下 如下代码所示↓

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
const int* fun()
{
	int a = 10;
	return &a;
}
int main(void)
{
	const int* ret = fun();
	printf("%d", *ret);
	return 0;
}

运行结果🖍

10

🍎上述代码解析⇢这个代码的意义就是当我们不想通过指针通过返回值的方案修改函数内部当中的变量。

🍑注→在上述代码当中需要注意以下几点如下↓

⒈在函数当中对其变量a进行了静态局部变量修饰目的就是它是属于局部变量一旦出了函数当中就会销毁变量。所以我们需要让变量修饰静态局部使得延长它的生命周期。 ⒉在主函数当中指针变量用cosnt进行了修饰就说明返回的时候我们是不能对其指向的地址进行修改变量的值,一旦对其进行修改编译器就会报错error。这个做法是达到目地的。 ⒊在这里如果我们把主函数当中指针变量中const去掉不对其进行修饰,此时如果我们对其进行修改编译器只会报出警告warning并不会报错 作用 提醒你对其返回值进行了const修饰。