宏定义
#define
#undef
定义有参数的宏时,应该注意:
~宏名与形参表的圆括号之间不能有空格
~宏定义中,字符串形式的参数最好用括号阔起来
带参数宏与函数比较
~有参数宏的形式参数不是变量,不分配内存空间,无需说明数据类型。而函数的形参是变量,要分配空间,在函数定义时必须说明类型。
~预处理程序认为有参数宏的实参是字符串,并用它取替换形参。
#define MUL(x,y) x*y
int a = 5,b = 10,c;
c = MUL(a+1,b+1);
c = a+1*b+1;
此程序中,用啊a+1去替换x。而在函数中,是先计算a+1,再把此值传给x。
~宏定义不会占用运行时间,只是编译时间较长。函数调用则会占用较多运行时间。
条件编译
~#ifndef 标识符 (换成#ifdef表示如果定义)(将标识符换成表达式同理)
程序段1
#endif 如果没有定义标识符,就编译程序段1
~#ifndef 标识符 (换成#ifdef表示如果定义)(将标识符换成表达式同理)
程序段1
#else
程序段2
#endif 如果没有定义标识符,就编译程序段1,否则编译程序段2
结构体和指针
p->number++ 得到p所指的结构体变量中的成员number的值,使用该值后再+1。
++p->number 得到p所指的结构体变量中的成员number的值,先+1后再使用。
共用体
union 共用体名
{
成员列表
}变量列表;
若进行以下赋值:a.i = 100; (a为共用体变量,i,c都是成员)
a.c = 'a';
此时共用体变量 a 中 i 已经没有值了,因为其存储空间用来存储 c 了。 同一块内存可以存放几种不同类型的数据。但在某一时刻只能存放其中一个值。
共用体所占内存长度取决于其成员的最大长度。
不能把共用体发的变量作为函数参数,函数也不能返回共用体变量。但阔以使用共用体变量的指针。
共用体类型的变量可以出现在结构体的声明中,也可以作为数组元素的类型,反之亦然。
使用typedef声明新类型名来替代已有的类型名
例: tydef int INT 声明后int 和INT等价
使用tydef 只为某种类型声明一个别名,并不是定义变量,也不会分配存储空间。
位运算
位运算符 &, |,^ (位异), ~(取反),<< , >>.
左移运算符<<将这个数的各个二进制位向左移动若干位。 左移n位相当于该数乘2^n。
同理右移时,右移n位相当于该数除以2^n.
右移时,当最高位0时,则补0;最高位为1时,有的系统移入0,有的移入1. 移入0的为逻辑右移。移入1 的为算数右移。
位域
C语言允许在一个结构体中以位为单位来使用内存。这种以位为单位的成员成为位域或位段。
若某一位段要从另一存储单元开始存放,结构体可定义为如下形式:(这里一个存储单元单元是4个字节)
int a: 6; 0~5的6位存放成员a
int b:4; 6~9的4位存放成员b
int :0; 10~31位空闲
int c:4; c从下一字节开始存储,占取32~35
int :8; 36~43强制空闲
int d: 从下一字节开始存储,占一个字节
使用这种方式可以使某些位强制空闲不予使用。