1、“编译预处理”是C编译系统的一个组成部分,主要有三种功能:文件包含、宏定义和条件编译。这些命令都以#开头作标志。
文件包含 #include
宏定义 #define
条件编译
2、不带参数的宏定义
一般形式: #define 标识符 字符串 例:# define PI 3.141592654
说明:
3、带参数的宏定义
1、宏要实现简单的函数功能,参数使用是比不可少的。由于宏常常限制,因此只能实 现简单的函数功能。
说明:宏引用形式与函数调用相似,但两者的实现过程完全不同。宏代换是在程序的 编译预处理时完成的,函数是在程序执行时解释的。
注意:D(3)=x*F(x) 先用x替换展开
=x*x-2 进一步对F(x)展开,这里没有括号
=3*3-2 最后把x=3代进去计算
=7
所以:D(D(3))=D(7) 就是大错特错了,没有坚持先替换的原则
4、文件包含
#include “文件名”(系统先在被包含文件的源文件所在文件目录中寻找,若找不到, 再将系统指定的标准方式检索其他目录。)
#include <文件名>(直接在系统指定的标准方式检索其他目录。)
5、条件编译
#ifdef<标识符> 程序段1
#else 程序段2
#endif
它的功能是:当指定标识符已经被定义过(一般用#define命令定义),则对程序段1进行编译,否则对程序段2进行编译。
#ifndef<标识符> 程序段1
#else 程序段2
#endif
它的功能是:若指定的标识符未被定义则编译程序段1,否则编译程序段2。这种形式的功能和第一种形式的功能相反。
# if表达式 程序段1
# else 程序段2
# endif
它的功能是:当指定的表达式为真(非零)时.编译程序段1,否则编译程序段2。应用这种条件编译的方法,可以事先给定某一条件:使程序在不同的条件下执行不同的功能。
第九章,指针
1、&:含义: 取变量的地址;单目运算符;优先级: 2;结合性:自右向左
*:含义: 取指针所指向变量的内容;单目运算符;优先级: 2;结合性:自右向左
互为逆运算
2、i_pointer-----指针变量,它的内容是地址量
*i_pointer----指针的目标变量,它的内容是数据
&i_pointer---指针变量占用内存的地址
i_pointer = &i = &(*i_pointer)
i = *i_pointer = *(&i)
3、直接访问:按变量地址存取变量值:i=3;
间接访问:通过存放变量地址的变量去访问变量:*i_pointer=20;
4、指针变量的定义
一般形式:[存储类型](指针变量本身的存储类型)数据类型(指针的目标变量的数据类型) *指针名;
*表示定义指针变量,不是‘*’运算符。
注意:
1)int *p1, *p2; 与 int *p1, p2;
2)指针变量名是p1,p2 ,不是*p1,*p2
3)指针变量只能指向定义时所规定类型的变量
4)指针变量定义后,变量值不确定,应用前必须先赋值
5、指针变量的初始化
一般形式:[存储类型] 数据类型 *指针名=初始地址值(赋给指针变量,不是赋给目标变量);
6、地址传递实现排序:
7、指针与数组
指向数组元素的指针变量
例 int array[10];
int *p;
p=&array[0]; //? p=array;
或 int *p=&array[0];
或 int *p=array;
数组名是表示数组首地址的地址常量
8、指针的运算
指针变量的赋值运算
p=&a; (将变量a地址Tp)
p=array; (将数组array首地址Tp)
p=&array[i]; (将数组元素地址Tp)
p1=p2; (指针变量p2值Tp1)
不能把一个整数Tp,也不能把p的值T整型变量
指针变量与其指向的变量具有相同数据类型
9、指针的算术运算:
P ± i <=> p ± i * d (i为整型数,d为p指向的变量所占字节数)
p++, p--, p+i, p-i, p+=i, p-=i等
若p1与p2指向同一数组,p1-p2=两指针间元素个数?(p1-p2)/d
p1+p2 无意义
10、指针变量可以指到数组后的内存单元
11、字符指针初始化:把字符串首地址赋给string? char *string;
string=“I love China!”;
int *p={1,2,3,4,5}; (′)
12、
Sizeof()既不是宏定义,也不是函数,值与malloc()相对应。
Strcmp()对两个字符串从左至右逐个比较,直到遇到不同的字符或‘\0’为止。
13、
14、例 int i, **p;
p=&i; (′)//p是二级指针,不能用变量地址为其赋值
15、用*p可输出地址(%o或%x), 也可用它输出字符串(%s)
16、