C语言预定义

265 阅读4分钟

「这是我参与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() 不初始化,里边数据是未知的垃圾数据。