上来先说点别的
编译过程:
(.c文件)-预处理(.i文件)-编译(.s文件)-汇编(.o文件)-链接(可执行文件)
预处理:
1.展开头文件
2.宏定义 宏替换只是替换,不会运算
宏不考虑c的语法,只是单纯的字符串替换
宏相对于调用函数来说,可以不考虑返回值的类型,因为宏可以不考虑c的语法
定义方法:
#define R 10 //不用分号 或者: #define ADD(a,b) a+b
typedef: //给变量起别名,加分号结尾,预处理后不替换
typedef int tni;//给变量类型int起一个别名tni,要用分号结尾
typedef int*p; //给int *起别名p;int *q =NULL;相当于 p q=NULL;
结构体:创建(声明) 定义 初始化 引用
struct xinx //创建结构体类型struct xinx
{
char name[20];
int sanwei;
};
struct xinx aver; //定义一个变量cangls(这种是声明与定义分离形式)
struct xinx aver={“cangls”,90 };//结构图初始化
printf(“%s\n %d\n”,aver.name , aver.sanwei); //引用结构体 . 是最高优先符
struct xinx *w; //定义指向结构体的指针
w=&xinx; //初始化指针
printf(“%s\n”,(*w).name); //引用 (*w)括号不能省,因为 . 比*优先
//可以使用”w->name”代替(*w).name
结构体指针:
1 stu.成员名(stu.name)
2(*p).成员名( (*p).name )
3p->成员名(p->name)
共用体:
结构体占用空间的大小,其实是:最后一个变量的偏移量(某一个成员的实际地址与这个结构体首地址的距离)(还有偏移量必须是这个变量所占用内存的整数倍,如果不是编译器就会在成员之间加上前充字节),加上最后一个变量的内存大小,如果前两个加起来不能整除最宽的变量,那么还要加上最后一个变量的尾部填充字节数。所有成员共享一个内存地址
1.联合体 union的作用:让几个不同类型的变量共享同一个内存地址,同一时刻只能存储
一个成员;初始化时只能有一个常量;内存长度取最长值;
2.结构体内存大小:以最后一个成员的偏移量+自身大小+字节填充
(电脑会自行填充至成员大小整数倍)