怎样理解static/const/volatile

1.static全局变量与普通的全局变量有什么区别?static局部变量与普通局部变量有什么区别?static函数与普通函数有什么区别?关键字static的作用是什么?在什么情况下用(我笔试很多次,基本上都有这个题)
再说这块之前首先说一下C的存储:
一般认为在c中分为这几个存储区:

  1. 栈 --有编译器自动分配释放
  2. 堆 --一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
  3. 全局区(静态区) --全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
  4. 另外还有一个专门放常量的地方。程序结束释放
    1)static全局变量与普通全局变量有什么区别?
    先看两个例子:第一个是:普通的全局变量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    第二个是静态全局变量:
    和上面的例子唯一修改的就是这个部分:
    在这里插入图片描述
    总结:静态全局变量和普通全局变量的不同就是:非静态全局变量可以作用于多个源文件(整个工程)而静态全局变量只能作用一定义它的一个源文件,同一工程的其他源文件不能使用。他们的相同点是:全局变量和静态全局变量都是静态存储方式。
    我们可以这样理解:把全局变量改成静态全局变量是改变了它的作用域。
    2)静态局部变量与普通局部变量有什么区别?
    静态局部变量只能初始化一次,下一依据上一次的结果;
    在这里插入图片描述
    静态局部变量不能被同一个源文件的其他函数调用。
    在这里插入图片描述
    当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
    3)静态函数与普通函数的区别
    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
    函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。这个类似静态全局变量和普通全局变量。
    定义静态函数的好处:22
    <1> 其他文件中可以定义相同名字的函数,不会发生冲突
    <2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
    关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
    对上面的三个方面总结一下:
    (1)在一个工程里,静态全局变量和普通全局变量都存储在静态存储区,但是静态全局变量的作用域知只是定义静态全局变量的源文件,而普通全局变量
    作用域是整个工程。
    (2)静态局部变量和普通局部变量:静态局部变量存储在静态存储区。而普通局部变量存储在栈。静态局部变量只能初始化一次,并且在函数调用过程中维持其值不变,其作用域是定义静态局部变量的函数内。
    (3)静态函数和普通函数,静态函数的作用域只是在定义静态函数的源文件,不能被其他源文件调用,并且其他源文件可以使用和静态函数相同的函数名。
    在我的做DSP开发的几年了,我自己写代码用的静态变量用的比较少,除非反而经常会有静态函数,比如关于网口发射接受的函数就是静态函数,并且在一个源文件里面,作用就是限制了调用函数的范围,以后发射或者接受部分的都在一个源文件里面完成。
    2.关键字volatile的作用是什么?在什么情况下用?(笔试很多次,基本上都有这个题,务必理解甚至背诵不知道这个问题,说明你嵌入式没有入行。
    1)定义:
    volatile是一个类型修饰符(type specifier),一个定义为volatile的变量是说这变量可能会被意想不到的改变,这样编译器就不会假设这个变量的值了,优化器用到这个变量时必须每次都小心地重新读取这个值,而不是使用保存到寄存器里的备份。
    第一:并行设备的寄存器(如设备寄存器)
    第二:一个中断子程序会访问到的非自动变量(nan-automatic variables)
    第三:多线程任务被几个任务共享的时候。
    在我工作中:公司是做卫地面检测,DSP主要完成捕获,跟踪的算法,
    捕获的通道号以及捕获的结果都会用动态变量。跟踪部分: FPGA送来的相关值dsp都会定义程动态变量,以及根据相关知识计算出来的鉴相,鉴频误差结果还有最后算出来的频率控制字都是需要定义为volatile变量,在实际工作中那些比较重要,又经改变的变量都推荐定义动态变量。另外就是指针指向的内存空间经常改变,这个指针也会定义成volatile指针。
    举个例子,一般在笔试的时候容易考到:
    很难测试出有什么问题,但是在嵌入式开发的时候,如果这样写就有课程出现问题,一般用volatile定义的变量都是经常,有课程会出现前一个值和后一个值不相同的情况,算出来不是某个值的平方,正确的写法如下
    在这里插入图片描述
    3.const(之前提到过,这次再完善一下)
    const是什么?相对准确的答案是:const意味着只读
    const int a; int const a ; const int *a ; int *const a ; int const *const a;
    const int a; 和 int const a ;两个作用一样,a是常整形数
    在这里插入图片描述
    常整型数不能再修改了
    必须再定义的时候同时初始化,不能分开完成
    const int *a 指针变量存储的地址可以变,但是指针指向的值不变;
    在这里插入图片描述
    改指针指向的值就不行
    int *const a 指针变量存储的地址不能变,指针指向的值可以变。
    在这里插入图片描述
    这样就不行
    int const *const a; 指针变量存储的地址,和指针指向值都不能变
    在这里插入图片描述
    在这里插入图片描述
    总结一下为什么要用const:
    第一:const声明了一个参数为常量,就是告诉人们就是直接告诉人们这个参数的目的。
    第二:通过优化器的一些附加信息,代码更加紧凑。
    第三:保护不希望更改的参数,防止被无意的代码修改,可以减少bug。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值