快捷搜索:  汽车  科技

c语言const参数,语言修饰变量的关键字

c语言const参数,语言修饰变量的关键字#include<stdio.h> int main(){ const int a = 1; printf("常量a的值为%d " a); int *pa = (int*)&a; *pa = 99; printf("常量a的值为%d" a); return 0; }运行结果:常量a的值为1 常量a的值为99也不一定,C 语言中有一个二五仔,指针。你说不可能的事,我偏偏就要把它变成可能。常量是不可更改的变量,即在一开始定义后,就不可以再直接修改了。且常量在定义的同时就要进行初始化,否则就是错误的。例如,将一个变量 a 通过 const 定义为常量,并给它初始化一个值为 1。后面想通过赋值运算符来修改常量 a 的值,就不能了。const a = 1; a = 2; // 这种做法是错误的那么,常量的值就一定不能修改吗?

c语言const参数,语言修饰变量的关键字(1)

C 语言中的关键字还是挺多的,比如经常看的类型关键字,如 int、char、float、struct、union、enum等;判断结构和循环结构的关键字,if、else、for、while等等;还有类型定义关键字 typedef。

本篇文章来和大家来介绍 const 和 register 关键字。这两个又叫做修饰符,用来修饰变量的,让普通的变量产生特殊的意义。

1. const

const 意为常量,在C语言中表示为常量修饰符

当一个变量带上 const 关键字,那么这个变量就成了一个常量。

常量是不可更改的变量,即在一开始定义后,就不可以再直接修改了。且常量在定义的同时就要进行初始化,否则就是错误的。

例如,将一个变量 a 通过 const 定义为常量,并给它初始化一个值为 1。后面想通过赋值运算符来修改常量 a 的值,就不能了。

const a = 1; a = 2; // 这种做法是错误的

那么,常量的值就一定不能修改吗?

也不一定,C 语言中有一个二五仔,指针。你说不可能的事,我偏偏就要把它变成可能。

#include<stdio.h> int main(){ const int a = 1; printf("常量a的值为%d " a); int *pa = (int*)&a; *pa = 99; printf("常量a的值为%d" a); return 0; }

运行结果:常量a的值为1 常量a的值为99

需要注意的是,当将常量 a 的地址赋给指针变量 pa 时,必须使用类型强转。因为在 C 语言当中,认为 const 是更广泛的类型限制,优先级更高。

2. register

register 直译为注册、记录,在程序中表示为寄存器变量修饰符。同时也是四种变量存储类的其中一个。

它的作用是暗示编译器这个变量有可能会被频繁地用到,建议把它放到寄存器里面,从而提高运行速率。

那什么是寄存器?寄存器是CPU中用来暂时存储数据的一个小型存储区域,和缓存、内存、硬盘一样都是用来存储数据的。

关于这四个的运行速度,互相之间的关系,有一个比喻我觉得有趣,但或许不那么恰当。

CPU 相当于是皇帝,寄存器相当于大内总管,缓存相当于大臣,内存相当于地方官员,硬盘相当于平民百姓。

平民百姓需要将紧急民情上达到地方官员。

地方官员整理成册,写成紧急奏折送到皇城里。

皇城里的大臣收到了地方官员的紧急奏折,再转交给大内总管,让他交给皇帝处理。

但有时候因为民情太严重了,地方官员就直接上交给大内总管,让大内总管直接交给皇帝。

c语言const参数,语言修饰变量的关键字(2)

由此可以知道,寄存器的处理速度是最快,硬盘是最慢的。

使用寄存器需要注意以下内容:

2.1 寄存器变量的类型应该是CPU所能接受的数据类型。

这就意味着,寄存器变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。因此,建议用 register 去修饰如 short、char、int 等比较小的数据类型。

不过,现在有些机器的寄存器也是可以存放浮点型的。

2.2 无法对寄存器变量使用 &。

寄存器变量,顾名思义是将变量存放在寄存器当中,而不是内存。

寻址运算符(&)是获取变量在内存中的位置。

因此无法对寄存器变量使用寻址运算符(&),否则运行后会产生报错。

register int a = 1; int *pa = &a; // 会产生报错

2.3 只有局部变量和形参可以作为寄存器变量。

局部变量和形参都有一个特性,那就是生命周期短,完成相关内容后,就结束了他们的使命,这一点寄存器就非常的喜欢。

寄存器是 CPU 中一小块的存储区域,因此可以说这里的空间都是寸土寸金。寄存器的存在是为了提高程序的运行效率,所以这里空间一般都是留给那些需要反复、频繁使用的数据。

如果是全局变量这种与天(程序)同寿的家伙放到寄存器,那么寄存器的空间就相当于默认舍弃掉一部分,这对于寄存器而言,是不能容忍的。

2.4 局部静态变量也不能作为寄存器变量。

在 C 语言当中,变量的存储类型只能使用一个。因此 register 和 static 是不能放在一起共用的。

register static int a = 1; // 错误写法

即便是可以放在一起,register 也不能跟 static 一起共用。

这是因为 static 所修饰的变量,称之为静态变量。

静态变量的生命周期和全局变量是一样,如果放在寄存器中,也是白白浪费了一块地方。

2.5 寄存器的数量是有限的的。

所以一些寄存器只接受特定类型的数据,比如指针或者浮点型。如果过多地使用 register 来进行修饰,编译器会自动将多余的 register 修饰符进行忽略。

还有最后一个问题,register 修饰的变量就一定是存放在寄存器中的吗?

不一定。

在过去,C 语言编译器是不会将变量存储在寄存器中, register 的出现是非常有价值的。

但如今,随着编译器越来越强,register 的作用是暗示和建议,请求尽可能地将声明的变量放在寄存器中,并不能做出最终的拍板。

现在即便不使用 register 修饰符,强大的编译器也会自动识别哪些变量是需要放到寄存器当中。而有时候就算带上了 register 修饰符,编译器也会自动忽略,把它看做是一个普通的变量。

最后

以上就是关于 C 语言 const 和 register 修饰符的介绍。

如果发现文中有什么错误之处,或者对文中有不理解的地方,欢迎在评论区留言。

猜您喜欢: