写点什么

【C 语言】const 关键字

作者:謓泽
  • 2022-11-06
    江西
  • 本文字数:3250 字

    阅读完需:约 11 分钟

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021 年度博客之星物联网与嵌入式开发 TOP5~2021 博客之星 Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP 创作者(创作新人榜 No.10)~[CSDN]周榜 172﹣总榜 955 ⇿ 全网访问量 35w+🏅

🆔本文由 謓泽 原创 发布在 InfoQ 如需转载还请通知⚠

📝个人主页-InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

⑤ const ⇿ 修饰

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

常量:不能被改变的量变量:可以被改变的量1、整形常量(八进制、十进制、十六进制)注意:八进制中个位不能超过7,十六进制不能超过F,F表示152、浮点常量(1.2、1.0、1e-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;}
复制代码

运行结果🖊

报错✘ERROR-错误表达式必须含有常量值。

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

②解析⇢数组的下标当中也必须要是常量,虽说 const 它可以修饰常量,但是它实际上还是一个变量这个是新手学 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(警告)

🍅Why cosnt 修饰⇢其实很简单就是我这个程序员不想修改这个变量,一旦我不小心进行了修改的话编译器会告诉我修改了这个变量。还有的话就是当我这个代码给别人的时候我用 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';
复制代码


运行结果🖊

ERROR-则程序会报错(左值指定的是 const 修饰的对象) 

★ 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修饰(int*)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

📝拓展-任何一个变量名在不同的应用场景当中,代表不同的含义。示例代码如下👇

int x = 1;int y = x;
复制代码

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

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

㈡[const]修饰指针

示例代码如下所示👇

int a = 10;int b = 20;int const *p = &a;*p = 20;//不可以p = &b;//可以
复制代码

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

📝说明⇢说明⇢第一种[const]修饰指针以及第二种[const]修饰指针的话,我会更加推荐第一种写法。

㈢[const]修饰指针

int a = 10;int b = 20;int * const p = &a;*p = 20;//可以p = &b;//不可以
复制代码

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

㈣[const]修饰指针

int a = 10;int b = 20;const int * const p = &a;*p = 20;//不可以p = &b; //不可以
复制代码

📝说明⇢第一个 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)的地址。这种被称之为预防性编程的一个概念。

㈥[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 修饰。



发布于: 2022-11-06阅读数: 62
用户头像

謓泽

关注

一句话介绍下自己~ 2022-01-29 加入

谁也不知道旅途的终点是怎么样的 现在只不过是刚启航⛳ 便要全力以赴!终点必将是星辰🌠大海🌊 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C 语言】const 关键字_11月月更_謓泽_InfoQ写作社区