-
预处理阶段工作:①将头文件展开直接放置到源文件中
②宏替换
③条件编译
注意:宏替换只是简单得字符串替换,且可以传递参数。
例如,#define N(n) n*10
int b = N(a); // 首先n替换成a,然后a*10。
易错:#define ADD(a,b) a+b
int c = ADD(a,b) * ADD(a,b);
/* 经过简单的替换会得到a+b*a+b,这显示不是我们想要的结果,因此加上括号保证优先级不会出错。*/
#define ADD(a,b) (a+b)
查看全部 -

生成一个.i文件,-E表示只让gcc举行预处理

预处理展开了头文件,形成了main函数上面的一大串文字
查看全部 -
结构体 数组 指针运用查看全部 -
(* w). 指针变量引用成员,可用 -> 代替
查看全部 -
结构体 引用: . 成员预算符,优先级最高
查看全部 -
.c--.i 预处理
.i--.s 编译
.s--.o 汇编
.o--可执行文件 链接
查看全部 -
宏:反复使用的常量,数组buffer大小;为了便于修改,定义成宏
查看全部 -
.c文件—>.i文件—>.s文件—>.o文件—>可执行文件
预处理 编译 汇编 链接
查看全部 -
define 宏的声明不需要会分号
查看全部 -
malloc分配内存块的函数;且需添加头文件#include <malloc.h>;
sizeof判断数据类型的长度符;
malloc返回的是开辟空间的首地址,他并不知道你放的是什么类型的东西,所以要用第一个括号中的内容强制转换指针类型为struct weapon*,和p1的类型转为一样,否则会警告指针类型不符合;
查看全部 -
union让不同类型的变量共用同一个内存单元,能节省内存空间,但只能存储一个成员;
声明方法:
union [name]{
...
};
使用:union [union_name] [value_name];
共用体声明时只能有一个常量。给共用体成员赋值时后赋值的变量值会覆盖前一个。
共用体所占的内存地址是其成员中内存地址最大的成员的内存地址。
结构体对象大小=最后一个成员的大小+最后一个成员的偏移量+填充字节数
偏移量:结构体中一个成员相对于结构体的首字节(即第一个成员的首字节)所距离的大小。(那么第一个成员相对于结构体的偏移量为0)
每个成员所占内存大小的偏移量=成员字节大小的整数倍。(若不是,则编译器会在前一个成员后做字节填充,使这个成员的偏移量=字节大小的整数倍。计算结构体内存地址大小时若总大小不等于最大成员字节大小的整数倍,会在最后一个成员后做字节填充。)
打印结构体的字节数:
printf("%lu",sizeof(...));
共用体元素地址都相同,可用:printf("%p\n",&data_1.a);
查看全部 -
如何对结构体进行初始化和访问结构体成员:
1、初始化 在花括号内 对结构体内变量成员依次赋值即可
struct weapon weapon_1 = {"w_name",100,200};
2、访问结构体成员:使用运算符.
:weapon_1.name,weapon_1.price//根据初始化的内容,=200
3、结构体数组,数组元素是结构体 struct weapon weapon_2[2]={"weapon_name1",50,100,"weapon_name2",100,200}; 或struct weapon weapon_2[2]={{"weapon_name1",50,100},{"weapon_name2",100,200}};
查看全部 -
结构体struct 是不同类型变量的集合,struct+结构体类型名称+{类型+变量1;类型+变量2......};
三种写法:1、struct +结构体类型名称+{类型+变量1;类型+变量2......};再在主函数中引用 struct +结构体类型名称+结构体名称;eg:struct weapon{char name[20];int atk ;}; struct weapon weapon_1;
2、直接在声明时定义,eg:struct weapon{char name[20];int atk ;} weapon_1;//大型程序中不便于维护
3、不指定结构体类型名称,但只能定义一种结构体。
查看全部 -
typedef 在预处理后不作替换处理,且语句后需加分号;作用域为当前大括号中,而宏定义则为全局通用;typedef一般用于结构体,eg:typedef struct stu{ } stu_t ;
查看全部 -
宏定义命令符 define 例:#define R 10
编译器预处理时将宏定义视为字符串并进行替换,
查看全部
举报

