视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
c语言存储关键字auto,static,register之详解
2025-09-29 16:42:14 责编:小OO
文档
c语言存储关键字auto/static/register之详解

朱有鹏

1、存储类相关的关键字1

1.1、auto

(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。

(2)auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。(既然在栈上,说明它如果不初始化那么值就是随机的······)

(3)平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。

#include

auto var1=20;//错误

int main()

{

auto int var2=15;//等价于int var2=15;

printf("var%d\\n

return0;

}

1.2、static关键字

(1)static关键字在C语言中有两种用法,这两种用法之间没有任何关联,是完全是的。也许当年本应该多发明一个关键字,但是C语言的作者觉得关键字太多不好,于是给static增加了一种新用法,导致static一个关键字竟然有两种截然不同的含义。

(2)static的第一种用法:用来修饰局部变量,形成静态局部变量。

(3)static的第二种用法:用来修饰全局变量,形成静态全局变量。

本节重点分析第一种用法,因为第二种用法涉及到链接域的问题在7.7节才涉及。

静态局部变量和自动局部变量(auto)的区别。本质区别是存储类不同,自动局部变量分配在栈上,而静态局部变量分配在data或者bss段上。

静态的局部变量和全局变量的相似处:

1、静态局部变量在存储类方面(数据段)和全局变量一样。

2、静态局部变量在生命周期方面,和全局变量一样。

静态局部变量和全局变量的区别是

作用域、链接属性不同。静态局部变量作用域是代码块作用域(和自动局部变量是一样的)、链接属性是无连接(后面会详细讲);全局变量作用域是文件作用域(和函数是一样的)、链接属性方面是外连接(后面会详细讲到)。

1.3、register

(1)register关键字不常用,当register修饰的变量时,编译器会将它分配在寄存器中,平时变量空间都是分配在内存中。Register修饰的被称为寄存器变量,和普通变量的使用方式没有什么区别,但是寄存器变量的读写效率会高很多,所以对那些读写频率很高的变量来说,使用regixter关键字将其变为寄存器变量,可以很好的提高其访问效率。

比如在我们的uboot中就用到了一个register类型的变量,因为这个变量在整个uboot中被使用的频率很高,为了提高效率,因此将其定义成为了register变量。平时写代码要被定义成register这种情况很少,一般慎用。编译的过程中,编译器只能承诺尽量将register修饰的变量放在寄存器中,但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限,不一定能够分配的上。

摘取自【朱有鹏c语言内核深度解析】下载本文

显示全文
专题