声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。
作者:sumjess
目前内容:第十二、十三章总结
1、C语言中的用户标识符的作用域和存储类:
2、编译预处理:
(1)在C语言中凡是以“#”开头的行,都称为“编译预处理”命令行;
(2)C语言预处理命令有:#define、#undef、#include、#if、#else、#elif、#endif、#ifdef、#ifndef、#line、#pragma、#error等,每行末尾不得用“;”结尾;
(3)宏替换:
一、 不带参数的宏定义:
①不带参数的宏定义命令行形式如下:
#define 宏名 替换文本
② 替换文本中可以包含已定义过的宏名,例如:
#define PI 3.14
#define ADDPI (PI+1)
③ 当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后紧接着加一个反斜线“\”。
#define sumjess sumjes\//不可以有空格
stry //需要顶头写,不可以有空格
④ 同一个宏定义不能重复定义,除非两个宏定义命令行完全一致。
⑤ 替换文本不能替换双引号中与宏名相同的字符串:
如果YES是已定义的宏名,则不能用与他相关的替换文本来替换printf(“YES”)中的YES。
⑥ 替换文本并不替换用户标识符中的成分:
例如,宏名YES,不会替换标识符YESSORNO中的YES。
⑦ 用作宏名的标识符通常用大写的字母表示,这并不是语法规定,只是一种习惯。
⑧ 在C程序中,宏定义的定义位置一般写在程序的开头。
二、带参数的宏定义:
① 带参数的宏定义:
#define 宏名(形参表) 替换文本
#define MU(X,Y) ((X)*(Y))
② 同一个宏定义不能重复定义,除非两个宏定义命令行完全一致。
③ 在调用带参数的宏名时,一对圆括号必不可少。
④ 宏替换都是在编译前由预处理程序完成的,因此宏替换不占运行时间。
⑤ 宏替换中,实参不能替换括在双引号中的形参。
4、中止宏定义:
#define PI 3.14
main()
{
....
#undef PI
....
/*以上PI的作用域从#define PI 3.14命令行开始,到#undef命令行结束。从#undef以后PI变成无定义,不再代表3.14了*/
5、文件包含:
#include "文件名" 或 #include <文件名>
注意:
① 在预编译时,预编译程序将用指定文件中的内容来替换此命令行。如果文件名用双引号括起来, 系统先在源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到 有关目录中去寻找;
② 如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找;
③ 在包含文件中还可以包含其他文件;
6、动态存储分配:
(1)malloc函数:
pi=(int *)malloc(sizeof(int)) ;
pf=(float *)malloc(sizeof(float)) ;
sizeof用来计算数据类型所占字节数,如果成功分配,该函数返回一个指向存储区首地址的基类型为 void的地址。若分配失败,函数返回空(NULL).
注:C标准规定malloc函数返回值的类型为void *,函数的调用形式为:malloc(size),要求size的类型为unsigned int。
(2)free:
free(p)
(3)calloc函数:
calloc(n,size);
要求n和size的类型都为unsigned int;
ps=(char*)calloc(10,sizeof(char))
sizeof用来计算数据类型所占字节数,如果成功分配,该函数返回一个指向存储区首地址的基类型为 void的地址。若分配失败,函数返回空(NULL).
注:C标准规定calloc函数返回值的类型为void *,n和size要求类型为unsigned int。