zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【C语言】const 关键字

2023-02-18 15:49:42 时间

 ?write in front?    ?大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流? ?2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ~51CTOP创作者~周榜126﹣总榜960⇿全网访问量30w+? ?本文由 謓泽 原创 CSDN首发?如需转载还请通知⚠ ?个人主页-謓泽的博客_CSDN博客 ? ?欢迎各位→点赞? + 收藏⭐️ + 留言?​ ?系列专栏-【C语言】关键字_謓泽的博客-CSDN博客? ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本? ⑤ const ⇿ 修饰 描述 ⇨ 有时候我们会想定义一个不能被修改的变量。那么举个例子吧(生活当中的一些依据)有些数据是可变的比如我们的年龄、工资等...那么有些数据是不能变的,你的亲生父母、血型等等...那么如果我们要用C语言描述的话就有这两个知识点常量 const 和变量了。

常量:不能被改变的量
变量:可以被改变的量
1、整形常量(八进制、十进制、十六进制)注意:八进制中个位不能超过7,十六进制不能超过F,F表示15
2、浮点常量(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修饰。