定义类型和变量,实际就是申明内存大小
typedef unsignedchar INT8;
auto、static、register:static限定作用域的静态变量;register修饰的变量不能访问它的地址
if(true) //0是False,非0是True
{}
else
{}
注:(1)if中的bool变量应直接出现在条件中,不需要进行比较(!b)
(2)变量与常量比较时,常量在符号左边
(3)float变量不能与0比较,而应该是范围
Case语句中的值只能是整型或字符型
C语言中规定只有相同类型的指针才可相互赋值
Void*可用于指针类型变量运算
Extern:(1)声明外部变量和函数;(2)“告诉”编译器用C方式编译:C++和一些变种C编译器按照“自己”方式编译函数和变量,通过extern关键字可以命令其以标准C方式编译
Extern “C“
{
int f(int a ,int b)
{ return a+b;}
}
Sizeof是编译器的一个关键字;
Const是只读变量,可通过指针修改变量值,不可改变空间大小
Constint* p 地址p可变,p指向的值不可变
Intconst* p 同上
Int* const p 地址p不可变,p指向的值可变
Constint * const p 地址p与p指向的值都不可变
修饰函数也同上
Volatile告诉编译器不要优化该变量,直接去内存取变量,如 int flag =0;a = flag;b=flag;编译器会优化flag,将以下flag换成a=0;b=0;而当硬件中断或多线程访问时flag改变了,但程序中的a,b没有改变。
所有volatile常用于中断标志位和线程之间交换数据的修饰符。
柔性数值:struct arr
{ int len;int array[]; }softarray
Array只是struct中的占位符,没有内存大小,可后来规定arr的大小来定array大小
Softarray *a = (softarray *)malloc(sizeof(softarray)+sizeof(int)*10);
定下array[]为10个数
Struct和union
Int || | | |
Char | |
Short | | |
Struct为7,union为4,写入从右到坐,读入时分2种情况:从右往左:小端;从左往右:大端
typedef为重命名已有的类型
typedef char *PCHAR #define char* PCHAR
PCHAR p1,p2; PCHAR p3,p4;
其中p1,p2,p3为指针;p4不是指针,是char类型
接续符(\):连接上句和下句。常用于宏定义中
转义符(\t,\n)
<<左移:高位丢弃,低位补0
>>右移:高位补符号位,低位丢弃
交换两数 void swap(a,b)//只针对整型
{ a = a^b;
b = a^b;
a = a^b; }
隐式转换
Char——>
Short——> Int——>unsignedint ——>long——>unsigned long——>double<——float
#开头的语句都为预处理指令,输出xxx.i,就是编译器先处理
(1) 处理注释,以空格替代
(2) 展开宏定义
(3) 处理#if,#ifdef…
(4) 处理#include
(5) 保留编译器需要使用的#program指令
编译:对预处理文件进行词法分析,语法分析,语义分析,分析结束后进行代码优化生成汇编文件,输出xxx.s
汇编:将汇编文件转成机器文件,输出xxx.o
链接器:将各模块之间相互引用部分处理好(xxx.o与xxx.a生成xxx.out)
条件编译:(1)可以避免重复包含一个头文件
(2)工程中区别不同产业线
(3)定义产品的开发版和调试版
#error生成一个编译错误消息,并停止编译
#warning生成编译器警告,并不停止
#line强制指定新的行号和编译文件名,并对源程序代码重新编号