C语言const关键字的用法

const作用: “只读(readonly)”

在C语言中,const关键字主要有以下几种用法:
1、const修饰变量
const 定义的是变量,但又相当于常量(相当于常量是因为const定义的变量初始化以后就不能在被改变,但是最终该量还是一个变量,只不过由常量的性质。);说它定义的是常量,但又有变量的属性,所以叫常变量,也就是一旦用const申明并初始化一个变量以后,这个变量就是一个常数不能再被改变。
const int num = 5; //num的值恒为5
2、const修饰指针
(1)、指向常量的指针
在这里插入图片描述
由上面的这个原理图可以看出来,指向常量的指针代表的是:在使用的时候,指向常量的地址p是可以改变的,但是该地址指向的数据*p是一个常量,不可以被重新赋值。
综合得:
1. p可以被修改为指向不同的整数常量或者非整数常量;
2. 可以解引p以读取数据;(*p)
3. 不能解引p从而修改它指向的数据。
这个用法会经常出现在一些函数的形参的修饰上,例如:
void printf_s(const char *s,const int *p); //在这两个形参的使用中主要是保证在传参的过程中保持原来的值不变。
(2)、指向非常量的常量指针
int num;
int *const p = &num
这个意味着指针不可以被改变,但是指针指向的数据可以被改变。
在这里插入图片描述
1. p必须被初始化为指向非常量变量;
2. p(地址)不能被修改;
3. p指向的数据可以被修改。

(3)、指向常量的常量指针
int n;
const int num = 0;
const int *const p = &num //一定要在申明的时候进行初始化
在使用指向常量的常量指针的时候,一定要注意申明变量的时候一定要对其进行初始化,不然的话程序会报错。
指向常量的常量指针意味着指针不能改变,指针指向的值也不能改变。
在这里插入图片描述
(4)、 指向“指向常量的常量指针”的指针
const int num= 0 ;
const int *const p = &num
const int *const *pi = &p //可以看出来就是一个指针的指针的引用,去指向常量的常量指针的指针
在这里插入图片描述
const 修饰后和未修饰前有什么区别
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值(申明是的初始化的值就是该变量的值),即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。如果定义的时候未初始化,我们知道,对于未初始化的局部变量,程序在执行的时候会自动把一个很小的负数存放进去。这样后面再给它赋初值的话就是“改变它的值”了,即发生语法错误。

用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。全局变量的生存周期为程序运行的整个过程这个是理所当然的。而使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程。我们知道全局变量是静态的,静态的生存周期就是程序运行的整个过程。但是用const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。

我们知道,局部变量存储在栈中静态变量存储在静态存储区中而经过 const 修饰过的变量存储在内存中的“只读数据段”中只读数据段中存放着常量和只读变量等不可修改的量

const和define的区别

  1. define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。
  2. const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。
  3. const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。
    总结得:
    编译时刻:宏是预编译(编译之前处理),const是编译阶段。
    编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
    宏的好处:宏能定义一些函数方法。 const不能。
    宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。

猜你喜欢

转载自blog.csdn.net/qq_39654819/article/details/87897534
今日推荐