指针数组里的每个存储区是一个指针类型
的存储区
字符指针数组里包含多个字符类型指针,其中
每个指针可以表示一个字符串
字符指针数组可以用来表示多个相关字符串
主函数的第二个参数是一个字符指针数组,
其中每个指针代表一个字符串,所有
这些字符串的内容都来自于用户的命令
主函数的第一个参数是一个整数,它表示
第二个参数里的指针个数
#define预处理指令可以用来定义宏
宏可以用来给数字起名字
定义宏的时候要把宏名称写在#define预处理
指令后,宏名称后写它所代表的数字
宏名称通常由大写英文字母构成
宏名称里不可以包含空格
用宏给数字起名字的时候不可以使用赋值
操作符
可以在程序里使用宏名称代表它所对应的数字,
编译器会把程序里的所有宏名称替换成
它所代表的数字
可以在编译命令里使用-D选项临时指定
宏所代表的数字
宏还可以给一个计算公式起名字
计算公式里包含未知数字,宏的参数用来
表示这些未知数字
编译器采用二次替换的方式处理带参数的宏
宏的参数不一定代表数字,所以它没有类型
如果宏有多个参数就需要用逗号把他们分开
宏不可以使用自己的存储区和函数进行数据
传递
宏没有形式参数也没有用来存放返回值的
存储区
能当作数字使用的宏必须编写成一个表达式
(因为宏没有用来记录返回值的存储区)
宏的参数直接代表函数的存储区,在宏里对
参数内容的修改可以直接影响函数
因为宏没有用来记录返回值的存储区,所以
不能保证优先计算宏里面的操作符
所有能当作数字使用的宏必须写在一对小括号
里面
宏没有形式参数所以不能保证优先计算参数
里面的操作符
编写宏的时候所有能当做数字使用的参数也都
必须写在小括号里面
不要把自增或自减的结果作为宏的参数使用
编写宏的时候可以使用一些特殊的符号,它们
叫做宏操作符
#是一个宏操作符,它可以把宏的参数转换
成字符串字面值
##也是一个宏操作符,它可以把一个代表
标识符的参数和其他内容连接得到
一个新的标识符
条件编译可以在编译的时候从几组语句里
选择一组编译而忽略其他组
#ifdef/#ifndef...#else...#endif
以上结构可以根据一个宏名称是否被定义过
从两组语句中选择一组编译
最开始的预处理指令应该从两个里选择一个,
它们的后面都要跟着一个宏名称
如果选择#ifdef就表示它后面的宏名称被定义
过就编译前一组语句,否则编译后一组
语句
如果选择#ifndef就刚好相反
#if...#elif(任意多次)...#else...#endif
这个结构也可以实现条件编译,它可以根据
任意逻辑表达式从多组语句中选择一组
编译