2026/08/03 C语言的常用关键字

1.const常量关键字
const是C语言的关键字之一,其实是英文constant的缩写,具有常量的含义,const关键字在C语言标准中是类型限定符,一般用于修饰变量的,可以用于降低变量的访问权限,相当于把变量的属性变为只读,变量的存储单元只能读,不能写。

举例:
int data = 10; data = 20; //变量是可读可写的
const int data; //只读变量

程序的中的常量都是存储在只读常量区(.rodata段),但是由于这个段的属性是只读的,并且没有办法通过名称来访问常量,所以就可以定义变量,通过变量名称来间接访问在程序运行期间不需要修改的常量的值!
如果需要利用变量来存储一个常量,则需要在定义变量的时候利用const关键字修饰,并且一定要完成初始化!

const关键字是可以修饰指针变量,但是 int const p;***和 const int *p;是有很大区别的!

(1)int *const p;
可以看到const离变量名称更近,const是修饰变量p的,而变量p是一个指针变量,变量p用于存储一个地址,但是变量p本身也可以得到存储单元,相当于降低了变量p的存储单元的属性,也就是变量p中存储的地址就不能发生变化,而存储的地址对应的内存单元中存储的值是可以改变的所以这个指针变量就称为指针常量,指针是常量。

(2)const int *p;
可以看到const关键字离指针变量p指向的地址下的数据类型更近,所以const是用于修饰指针变量p指向的地址的,所以也可以写成 int const *p;变量p的存储单元是没有受到影响的,而是变量p中存储的地址对应的存储单元的权限降低为只读了,可以为变量p是美杜莎之眼,被称为常量指针,即指向常量的指针。

注意:只有通过指针变量p来间接访问地址下的值时,才会出现错误,因为变量p中存储的地址被变量p影响了,权限降低为只读了,但是只要不通过变量p来间接访问,则就不会受到变量p的影响。

2.extern 关键字
extern是C语言关键字之一,是英文单词external的缩写,中文具有外部的含义,extern属于C语言标准中提供的存储域说明符之一,extern关键字可以声明一个函数或者一个变量的属性是外部可链接的,意味着可以被外部文件调用。
C语言标准中规定函数定义的时候默认是可以被外部链接的,也就是函数声明的时候默认是有extern的,因为函数定义时有函数体,函数声明时没有函数体,所以编译器可以区分函数声明和函数定义。

但是变量则不同,变量遵循“先定义,后使用”的原则。变量在定义的时候内核就会分配内存空间,所以编译器没办法区分用户是打算声明一个变量还是定义一个变量,所以为了避免二义性,C语言就规定如果打算声明一个变量可以被外部链接,就必须使用extern关键字进行声明。
全局变量只能定义一次(不加 extern,带初始化 = 定义)
其他文件要用这个全局变量,必须用 extern 声明,不能重新定义,声明时也不可以赋值

3.static 关键字
用户在某些情况下并不想让源文件中的所有函数被可以被其他文件调用,但是函数定时默认的属性都是extern的,可以在定义函数的时候使用关键字static进行修饰,static关键字表示静态的,也属于C语言中的存储类说明符,如果用来修饰函数,则表达该函数的作用域只对本文件有效。
使用static关键字修饰的函数也被称为静态函数,静态函数只能在函数定义的源文件中使用。由于静态函数的作用域只在当前文件有效,所以静态函数的名称可以和其他源文件中的函数重复。
注意:如果静态函数被定义在头文件中,则包含该头文件的源文件都可以使用该静态函数,因为预处理阶段头文件中所有内容会被预处理器拷贝到源文件中。

4.auto 关键字和register 关键字
(1)auto关键字

auto是C语言关键字之一,中文具有自动的含义,属于存储类说明符之一,只能用来修饰局部变量,所以只能在函数中使用,auto关键字具有隐式说明,在局部变量创建的时候默认存在,一般用auto修饰的变量也被称为自动变量,指的是变量由系统自动管理,变量创建时系统自动分配内存单元,变量的作用域结束时系统自动释放。

(2)register关键字

register是C语言关键字之一,中文具有寄存器的含义,属于存储类说明符之一。使用register关键字修饰的变量也被称为寄存器变量,只能用来修饰存储在寄存器中的局部变量,目的是提高程序的运行效率。相当于告诉编译器:这个变量使用频率极高,建议不要放在内存,直接存入 CPU 通用寄存器,减少内存读写开销,提升访问速度。
由于寄存器没有内存地址,所以不能取地址。
仅能修饰局部变量,不能修饰全局变量、数组、结构体、指针数组;
只是建议,不是强制:CPU 寄存器数量有限,寄存器被占用时,编译器会自动把变量放回内存;

5.inline 关键字
C语言标准中提供了一个关键字叫做inline,被inline关键字修饰的函数被称为内联函数,一般在定义函数接口的时候才可以使用inline进行修饰。被关键字inline修饰的函数就被称为内联函数,编译时把函数的代码直接拷贝、嵌入到调用处,不生成独立函数调用指令,省去函数调用开销(压栈、跳转、返回、栈帧创建销毁),提升小段高频函数运行速度。
程序中的main函数不应该使用inline修饰。
可以知道,C语言标准中规定内联函数的调用要尽可能的快,所以要求内联函数中的语句要尽可能短。
可以知道,内联函数和普通函数的区别只是在函数调用的时候不需要进行函数跳转,也不需要保存函数上下文,因为编译器会把内联函数的代码段拷贝一份到被调用的位置,所以内联函数中不应该使用递归或者循环等代码,要求内联函数一定要精简,越短越好。

当然,一个普通函数如果代码段很多,其实也可以使用关键字inline进行修饰,但是编译器不一定会把这种函数当做内联函数来对待。

注意:在函数定义的时候用inline修饰是有效的,在函数声明的时候用inline来修饰是无效的。

注意:具有内部链接的函数都可以作为内联函数,但是要和被调用的函数在同一个源文件中,如果两个源文件都打算使用内联函数,此时有两种方案:第一种是在另一个源文件中重新定义一个相同的内联函数,第二种则是把内联函数定义在头文件中,需要使用的源文件就只需要包含头文件即可。

image

posted @ 2026-08-03 16:13  !城北徐公.!  阅读(5)  评论(0)    收藏  举报