C语言笔记——存储类 作用区域 生命周期 链接属性2

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类型常量,还有字符串常量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小相619

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值