本文章依据唐老师视频总结而来.
变量属性
C语言中变量可以有自己的属性
定义变量时可加上"属性"关键字
"属性"关键字指明变量的特有意义
语法:
auto
auto即C语言中局部变量的默认属性
auto表明将被修饰的变量存储于栈上
编译器默认所有的局部变量都是auto
static
static关键字指明变量的"静态"属性 即只会被初始化一次
- static修饰的局部变量存储在程序的静态区
static关键字同时具有"作用域限定符"的意义
- static修饰的全局变量作用域只在声明的文件中
- static修饰的函数作用域只在声明的文件中
register
register关键字指明将局部变量存储于寄存器中
register只是请求寄存器变量,但不一定请求成功
register只可修饰局部变量、函数形参
不能用&运算符获取register变量的地址
extern
extern 用于声明"外部"定义的变量和函数
- extern 变量在文件的其它地方分配空间
- extern 函数在文件的其它地方定义
extern 用于"告诉"编译器用C方式编译
C++编译器和一些变种C编译器默认会按"自己"的方式编译函数和变量,通过extern关键字可命令编译器"以标准C方式进行编译"
const
const修饰的变量是只读的,本质还是变量
只读变量:不可直接修改它,可通过指针间接修改
const修饰的局部变量在栈上分配空间
const修饰的全局变量在全局数据区分配空间
const修饰的变量会占用内存空间
const只在编译器有用,在运行时无用
tips
const修饰的变量不是真的常量,它只是告诉编译器变量不能出现在赋值符号左边
现代C语言编译器中,修改const全局变量将导致程序崩溃
标准C语言编译器不会将const修饰的全局变量存储于只读存储区,而是存储于可修改的全局数据区,其值可以修改
现代C编译器中的const将具有全局生命周期的变量存储于只读存储区
const修饰指针
const int* p;
int const * p; //p可变,p指向的内容不可变
int * const p; //p不可变,p指向的内容可变
const int * const p; //p和p指向的内容都不可以变
左数右指
当const出现在*的左边时指针指向的数据为常量
当const出现在*的右边时指针本身为常量
const 修饰函数参数和返回值
const 修饰函数参数表示在函数体内不希望改变参数的值
const 修饰函数返回值表示返回值不可改变,多用于返回指针的情形
volatile
volatile 可理解为 "编译器警告指示"
volatile 用于告诉编译器必须每次去内存中读取变量值
volatile 主要修饰可能被多个线程访问的变量
volatile 也可修饰可能被未知因数更改的变量
小结
auto变量存储在程序的栈中,默认属性
static变量存储在程序静态区
register变量请求存储于CPU寄存器中
extern变量在文件其它地方分配空间
extern能够指示编译器按照标准C方式编译程序
const变量具有只读属性
const不能定义真正意义上的常量
const将具有全局生命周期的变量存储于只读存储区
volatile强制编译器减少优化,必须每次去内存中取值