4.7.4 存储类相关的关键字2
1、extern
extern用来声明全局变量,只要是在a.c中声明变量,在b.c中使用变量。
gcc a.c b.c -a ab
C 语言中程序编译是以单个.c源文件为单位的。
这就导致了a.c中不能使用b.c中定义的变量。解决方案是:声明
声明一个变量的方法就是添加 extern,声明的时候不能初始化。
2、volatile
可变的,易变的:便是这个变量可以被编译器之外的东西改变。
编译器之外的改变就是说改变不是当前代码造成的,编译器在编译当前代码之前
无法预知。
譬如硬件自动更改了变量的值。
中断isr中应用的变量,多线程中共用的变量,硬件会自动更改的变量。
编译器在volatile修饰的变量时,就不会对该变量进行优化,不容易出现错误。
int a, b, c;
a = 3;
b = a;
c = b;
无优化的情况下 :内存要读3次,写3次
编译器优化的条件下,只读一次,写3次。
应该加而不加,可能会出错。
不加而加了,程序不会出错,会降低程序运行效率。
正确区分,该加的时候加,不该加的时候不加
3、restrict
C99中才支持,所以很多延续C89的编译器是不支持restrict关键字,gcc支持的
只用来修饰指针,不能用来修饰普通变量。
作用:告诉编译器,只能通过该指针来访问该内存
memcpy和memmove的区别
4、 typedef
属于存储类关键字
4.7.5 作用域
1、局部变量代码的作用域
int main(void)
{
printf("a = %d .\n", a);
}
void func(void)
{
int a = 5;
printf("a = %d .\n", a);
}
2、循环控制 变量是在外部定义
3、函数名和全局变量的文件作用域
文件作用域的意思是全局的访问权限。也就是整个.c文件都可以访问这个东西。
总结 :
不管是局部变量、全局变量、函数都是先定义才可以使用。
严格来说每一个变量的作用域都是在自己 所在的代码和 文件。
但是定义式之前使用,可以进行声明。
4、同名变量的掩避规则
问题:编程时,不可 避免 会出现同名变量。变量同名不一定会出现错误。
首先,如果两个同名变量的作用域不同且没有交叠。则没有任何影响。
如果两个同名变量作用域有交叠,C语言规定,作用域交叠的空间范围内,
作用域小的变量会掩避掉作用域大的。
4.7.6 变量的生命周期
1、研究变量生命周期的意义
有助于理解变量的行为特征
2、栈变量的生命周期
局部变量 生命周期是临时的,在代码执行过程中,按照需要去创建、使用、销往。
譬如一个函数内定义的局部变量
3、堆变量的生命周期
堆内存空间是客观存在的,是由惭怍系统维护的,我们程序只是去申请使用然后释放。
我们只关心程序使用 堆内存的时间,从申请时到使用,知道free消亡。
malloc 和free
堆内存在malloc 之前和free之后不能再去访问。
4、数据段,BSS段变量的生命周期
全局变量的生命周期是永久的,程序执行时诞生,终止时消亡。
全局变量所占用的内存是不能被自己的程序释放的。如果程序 申请了过多的全局变量会导致这个程序一直占用大量 的内存。
5、代码段,只读段的生命周期
就是成都执行的代码,起始就是函数,生命周期是永久的,不过一般的代码周期我们是不关注的。
有时候放在代码 的不只是代码 ,还有const类型常量,还有字符串常量。
C语言笔记——存储类 作用区域 生命周期 链接属性2
最新推荐文章于 2023-04-29 10:35:39 发布