#define
无参数的宏定义的一般形式为:#define 标识符 字符序列
如:#define TRUE 1
注意事项:
1.之作字符序列的替换工作,不作任何语法的检查
2.如果宏定义不当,错误要到预处理之后的编译阶段才能发现
带参数宏定义:#define 标识符(参数表)字符序列
如:#define MAX(A, B) ((A) > (B)?(A):(B))
代码 x = MAX(p, q)将被替换成 y = (p) > (q)? (p):(q)
注意:
1.宏名标识符与左圆括号之间不允许有空白符,应紧接在一起
2.宏与函数的区别:函数分配额外的堆栈空间,而宏只是替换
3.为了避免出错,宏定义中给形参加上括号
4.末尾不需要分号
5.define可以替代多行的代码,记得后面加 \
,如:
#define MALLOC(n, type)\
((type*)malloc((n)*sizeof(type)))
头文件
分别写在不同的文件中
重复包含的问题
#ifndef (XXX)
#define XXX
内存分配与释放
int* ptr; //声明指针
//在堆中申请内存,分配128个int
ptr = (int*)malloc(sizeof(int)*128);
//无论申请的空间大小 一定要进行校验 判断是否申请成功
if (ptr == NULL)
{
return 0;
}
//初始化分配的内存空间
memset(ptr, 0, sizeof(int)*128);
//使用
*(ptr) = 1;
//使用完毕 是否申请的堆空间
free(ptr);
//将指针设置为NULL
ptr = NULL;
文件读写相关函数
1.fopen函数
2.fseek函数
3.ftell函数
4.fclose函数
自我检测
1.用十六进制文本编辑器,打开一个记事本的.exe文件,再打开在内存中的记事本进程,记录下这两个文件的不同。
2.将记事本的.exe文件读到内存,并返回读取后在内存中的地址
3.将内存中的数据存储到一个文件中,(.exe格式),然后双击打开,看是否能够使用。