Chapter1
1定义与声明:定义是编译器创建一个对象,为这个对象分配一块内存并给它取名字。声明没有分配内存。
2 register:尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率,但register不能用地址运算符&
3 Static作用: 1修饰变量 全局和局部
2 修饰函数成为内部函数
4关键字 sizeof
5 const:编译器通常不会为普通const只读变量分配存储空间,而是将他们保存在符号表中,这使得他成为一个编译期间的值,没有了存储与读内存的操作,使得它效率很高。
#define宏在预编译阶段进行替换,而const修饰的只读变量在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。
6volatile:易变,不稳定。这种变量是随时可能发生变化的。每次使用它的时候必须从内存中取出i的值,即保证对特殊地址的稳定访问。
7 struct最后1个byte长即使是空的也一样
柔性数组 (flexible array)结构中的最后一个元素允许是未知大小的数组,叫做柔性数组成员。
Struct默认属性是public的
8Big endian :字数据的高字节存储在低地址,低字节存储在高地址。
Little endian:字数据的低字节存储在高地址,低字节存储在低地址
怎样check是Big endian还是little endian
Int checkSystem()
{
Union check
{
Int I;
Char ch;
}c;
c.i=1;
return(c.ch == )
}
9 enum与define区别
1 #define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值
2在一般编译器里,可以调试枚举常量,不可以调试#define
3 枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个
Chapter3 Preprocessing
10 #define #undef #include
#if #else#elif #ifdef #ifndef
#line 改变当前行数和文件名称
#error 遇到#error就会生成一个编译错误提示消息,并停止编译
#pragma 为实现时定义的命令,允许向编译程序传送各种指令例如,编译程序可能有一种选择,支持对程序执行的跟踪,可用#pragma语句指定一个跟踪选择。
与Define比,const修饰的数据是有类型的,#define宏定义的数据没有类型。编译器为const修饰的制度变量作类型校验。但是const修饰的不是常量而是readonly的变量,const修饰的只读变量不能用来作为定义数组的维数,也不能放在case关键字后面。
#undef 撤掉宏定义
条件编译 #ifdef #ifndef
#pragma 设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma message 在编译信息输出窗口输出相应的信息
#pragma pack 内存对齐
#pragma pack(n) 编译器将按照n个字节对齐
#pragma pack() 编译器将取消自定义字节对齐
第五章 内存管理
内存三个区:静态区,堆,栈
静态区:自动全局变量和static变量,在整个程序的生命周期都存在
栈:保存局部变量,只在函数的范围内存在,当函数运行结束,这些内容会被自动销毁。效率高但空间大小有限。
堆:由malloc/new分配,free/delete决定