在C语言中,联合有以下特性:
- 存储方面:所有的成员共享一个空间
- 同一时间只有一个成员是有效的
- union的大小是其最大的成员
- 初始化:对第一个成员做初始化
静态本地变量:
- 在本地变量定义时加上static修饰符就成为静态本地变量
- 当函数离开的时候,静态本地变量会继续存在并保持其值
- 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量具有全局的生存期,函数内的局部作用域
- static在这里的意思是局部作用域(本地可访问)
*返回指针的函数:
- 返回本地变量的地址是危险的
- 返回全局变量或静态变量的地址是安全的
- 返回在函数内malloc的内存是安全的,但是容易造成问题
- 最好的做法是返回传入的指针
变量注意:
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- *使用全局变量和静态本地变量的函数是线程不安全的
编译预处理指令:
- #开头的是编译预处理指令
- 他们不是C语言成分,但是C离不开它
- #define用来定义一个宏
- #define PI 3.14159,#define <名字> <值>
- 注意没有结尾的分号,因为不是C的语句
- 名字必须是一个单词,值可以是各种东西
- 在C语言的编译器开始编译之前,编译预处理程序(cpp)会把程序的名字换成值
- 完全的文本替换
宏:
- 如果一个宏的值中有其他的宏的名字,也是会被替换的
- 如果一个宏的值超过一行,最后一行之前的行末需要加\
- 宏的值后面出现的注释不会被当作宏的值的一部分
- #define_DEBUG,没有值的宏
- 这类宏是用于条件编译的,后面有其他的编译预处理指令来检查这个宏是否已经被定义过了
- 预定义的宏:
- _LINE_,_FILE_,_DATE_,_TIME_
- 带参数的宏:
- 举例:#define cube(x) ((x)*(x)*(x))
- 宏可以带参数,其原则如下:
- 一切都要括号
- 整个值要括号
- 参数出现的每个地方都要括号
- 举例:#define RADTODEG(x) ((x)*57.29)
- 宏可以带多个参数
- #define MIN(a,b) ((a)>(b)?(b):(a))
- 也可以组合(嵌套)使用其他宏