声明
--------------
在你能够在表达式中使用相应表达式之前,编译器需要知道它们的类型、作用域。
所以,每一个编译单元必须包含在这个编译单元中用到的每一个标识符的声明。
除了用作goto语句跳转目标的标签外,所有其它的标识符都必须在它们第一次使用
之前显示声明。
typedef 声明: 为一个已经存在的类型声明一个新的名字。
存储类别说明符
extern static auto register
声明中的存储类别说明符决定被声明标识符的链接方式和相应对象的声明周期。
带auto声明的对象具有自动存储期。在函数内声明的对象默认具有自动存储期。
register关键词提示编译器应该使一个对象能够被尽可能快的访问。理想情况
是把该对象存储在寄存器中。不能在带register声明的对象上使用取地址符。
类型限定符
const volatile restrict
volatile关键字指示编译器在每次用到对象的值时都应该重读一次(而不用缓存的值)
,即便自从上次读取之后,程序没有改变它的值。
受限指针:受限指针与它所指向的对象之间有如下特殊关系
在指针生命周期内,它所指向的对象不能改变,该对象智能通过该受限指针进行访问,
不能通过其它方式访问。
FILE *fopen( const char * restrict filename, const char * restrict mode );
成员变量为位段的结构体
struct CharColor { unsigned fg:4, bg:3, bl:1 } attribute = {12, 1, 0};
sizeof(attribute) is 4;
C有三种类型的存储期
static automatic allocated
静态存储期的对象被放在程序的数据段, 自动存储期的对象被放在栈中。
所有在函数外定义和在函数内定义但带有存储类别说明符static的对象都具有静态存储期。
它们在程序执行前被创建和初始化。它们的生命周期跨越整个程序执行期间。
所有函数内定义且没有带static的对象和所有函数参数都具有自动存储期。
输入输出
---------------
可以调用fflush刷新输出缓冲。
使用setbuf()或setvbuf()可以改变文件缓冲方式。
stderr是非缓冲模式。
FILE *tmpfile( void );创建一个以二进制方式进行读写的临时文件。