《悲伤的往事》
当我在简历中写到:精通C语言。
面试官:你好 ,谈谈你对volitale的理解吧,为什么会有volitale,他有什么用?
我:volit…………???
面试过后,我决定洗心革面,重新做人,没错,深剖C!!!
于是就有了这篇博客
1.const
用const修饰的变量意为不可直接修改的变量(常变量)
拥有变量属性,其值不可修改
>> const修饰一般变量
补充:const不能修饰内置关键字,像const int a这样; 就等价于 int const a;
>> const修饰指针变量
>> const修饰函数返回值和参数
①修饰形参。
void show(const int* p) { printf("%d", *p); } int main() { int a = 10; int* p = &a; show(p); return 0; }
注:如果不想对实参进行修改,那么可以为形参加上const,提高代码的健壮性,
②修饰返回值
这个一般很少用到,举个例子了解下即可。
>> const难点
这两段代码都合法嘛???
先编译第一段,可以编过,但是会有警告。
原因是p是用const修饰的,p赋给了没有用const修饰的q,相当于权限放开了
第二段代码自然就没问题了,相当于给q新增了const权限
这是我的const学习笔记
2.static
static是一个存储关键字,它可以修饰局部变量,全局变量,函数
在谈static之前,我们先看一下C地址空间,全局变量存在哪,局部变量存在哪……
>> 修饰局部变量
局部变量特点:在代码块中定义的叫局部变量,随函数调用开辟,函数结束释放
static 修饰局部变量改变的是它的生命周期,从原来的栈上开辟变为在全局静态区开辟
>> 修饰全局变量
static修饰全局变量,改变它的作用域,限制它只能在本文件内使用
>> 修饰函数
static修饰函数,限制它只能在本文件内被调用
3.volitale
这里直接贴一张我的笔记图
举个例子:
int flag = 1;
while(flag){
printf("hello world");
}
如果flag不加volitale,编译器默认优化,把flag加载到cpu寄存器里,编译器发现你在循环判断的时候没有对flag的值进行修改,所以它以后读取flag的值就是寄存器里的值,从而提高效率。