1.常量宏定义
#define TI 3.14
#define M 3
#define N 4
#define ADD ((M)+(N))
1>宏定义在预处理阶段进行替换
2>宏定义中有复杂的表达式,要多多使用()
3>在进行宏定义时,默认是不允许出现换行,如果需要需要在末尾添加换行符 \
2.使用宏函数,最后一个表达式的结果作为宏函数的返回值
#define MAX(a,b) ({a>b?a:b;}) 宏函数多用于底层封装时
例子:
#include<stdio.h>
//定义函数
#define MAX(a,b) ({(a) > (b) ?(a) : (b) ;})
#define MIN(a , b ) ({int ret;
if(a>b)
ret = b;
else ret = a;
ret; })
int main(int argc , const char argv[])
{
int max =MAX(100,50);
printf(“max = %d\n”,max);
int min = MIN(100 , 50);
printf(“min = %d\n”,min);
return 0;
}
3.宏定义使用##进行两个宏定义参数的拼接
4.宏定义的预定义
//当行注释
/**/ 多行注释,不可以嵌套
#if 0/1 #else #endif 多行注释
二、动态分配内存
总结:
1.在程序中可以动态指定本次分配内存的大小
2.malloc分配的内存在堆区
3.malloc分配的内存是连续的,可以通过数组的格式访问内存中的数据p=(int)malloc(sizeof(int)*10);在堆区分配40个字节的空间,并且是连续的。
4.malloc申请的内存需要free释放,如果在一个一直运行的程序中,反复调用malloc,但是没有调用free就会导致"内存泄漏"。如果malloc申请的内存没有调用free,但是程序执行结束了,内存会被操作系统释放掉。
5.malloc申请的内存在释放的时候,一定使用的是从首地开始的内存。free函数调用之后一定要将指针执向NULL,否则在使用这个指针的时候就是在使用"野指针"如果释放堆区的空间没有执向NULL,则这个指针已让可以使用,并且编译不会报错,当时使用了非法的内存空间,别人再次malloc时这块空间又可能会被重新分配,执行也不会报错,但是程序的运行结果为止。如果释放堆区的空间没有指向NULL,就会出现野指针。如果释放堆区的空间,并且释放之后将指针指向NULL,此时这个指针依然可以使用,编译器不会报错,但是指向时会报段错误(核心已转储).