「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。
预处理命令须知:
通常,预处理命令位于源文件的开头,但不一定必须位于开头,也可以写在函数与函数之间;由于预处理命令的末尾不加分号,所以,不能在一行上写多条预处理命令,否则,系统处理时就会把它当作一条命令;宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。
宏名:就是指宏定义,也就是给参数类型重新命名。
列如:宏定义行:#define N 100
无参宏的宏名后不带参数。其定义的一般形式为:#define 标识符 字符串
其中的"#"表示这是一条预处理命令。凡是以"#"开头的均为预处理命令。"define"为宏定义命令。"标识符"为所定义的宏名。"字符串"可以是常数、表达式、格式串等。宏替换可以代替任何数据类型,不受数据类型的限制。例如:#define N 100它的作用是指定标识符N来代替常数100。在编写源程序时,所有的100都可由N代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用100去置换所有的宏名N,然后再进行编译。
宏定义的特点:
宏替换不具有计算功能。
宏替换不占用运行时间。
宏名不具有类型。
用宏定义算法:
#include <stdio.h>
#define MUL1(x,y) x*y
#define MUL2(x,y) (x)*(y)
#define MUL3(x,y) (x*y)
main()
{ int m=2,n=3;
printf( "%d,%d,%d\n",MUL1(m,m+n)*2,MUL2(m,m+n)*2,MUL3(m,m+n)*2 );
}
程序运行后的输出结果是_10,20,14_____。
若要在C程序中调用动态分配函数malloc需要引入头包文件:stdlid.h
#include<stdlid.h>
malloc函数使用:
int *p;
p = (int *)malloc( sizeof(int) );
注意:
(1)因为malloc返回的是不确定类型的指针,所以返回之前必须经过类型强制转换,否则编译报错,如:“ 不能将void赋值给int变量 ”。
(2)malloc只管分配内存,并不会初始化,其内存空间中的值可能是随机的。如果分配的这块空间原来没有被使用过,那么其中每个值都可能是0。相反,空间里面可能遗留各种各样的值。
(3)实参为需要分配的字节大小,如果malloc(1),那么系统只分配了1个字节的内存空间,这时注意,如果在这块空间中存放一个int值,由于int类型占4个字节,那么还有3个字节未分配空间,系统就会在已经分配的那1个字节的基础上,依次向后分配3个字节空间,而这就占有了“别人”的3个字节空间,“别人”原有的值就被清空了。
(4)分配的空间不再使用时,要用free函数释放这块内存空间。
Free 函数使用:
free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。
避免错误:
void myfree(void ** point)
{
if(*point != NULL)
{
free(*point);
*point = NULL;
}
}
头文件 #include <stdlib.h>
calloc函数:
calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。
calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。