/*
读书笔记类型多种多样,有摘抄型的,有感想型的,有批注型的,有摘要型的……
现在正在研读《C和指针》,其中有很多我认为必要的知识点,摘抄并简单整理了一下,记录在这里。
*/
59. 在UINX、MS-DOS等操作系统中,会让用户通过命令行编写参数来启动一个程序的执行。这些参数通过两个形参传递给main函数。main函数原型:
int main( int argc, char **argc );
argc是一个整数,用于表示参数的数量。argv是一个指向指针的指针,它指向一个序列的字符型指针,该序列中的每个指针指向一个命令行参数,该序列以一个NULL指针作为结束。其中第1个参数就是程序的名字,程序可以通过对argv使用间接访问来访问命令行参数。
60. 书中介绍的把16进制数转成一个个字符的代码片段:
remainder = value % 16;
if( remainder < 10)
putchar( remainder + ‘0’ );
else
putchar( remainder – 10 + ‘A’ );
61. 字符串常量实际上是指针,指向字符的指针。
1) “xyz” + 1;——这个表达式的结果是个指针,指向字符串的第2个字符y.
2) *”xyz”;——这是对指针进行间接访问,结果就是x.
3) “xyz”[2];——这是一个合法的表达式,值为z.
出现在表达式中的字符串常量是一个常量指针,它指向字符串的第1个字符,和数组名一样,既可以用指针表达式,也可以用下标来使用字符串常量。
62. 编译C程序的第1个步骤称为预处理(preprocessing)阶段,在这个阶段C预处理器(preprocessor)对源代码进行文本性质的操作,主要任务包括删除注释、插入被#define指令包含的文件内容、定义和替换#define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。
63. 用#define定义的内容较长时,可以分成几行,除最后一行外,每行的末尾都要加一个反斜杠(\),如:
#define DEBUG_PRINT printf( “File %s line %d:” \
“x=%d, y=%d, z=%d”, \
__FILE__, __LINE__, \
x, y, z )
宏定义的这种技巧不应被滥用。如果相同的代码需要出现在程序多个地方,通常更好的方法是把它实现为一个函数。
上述代码片段中有一些符号,如__FILE__是预处理器符号,常用的预处理器符号有5个,详见下表:
64. 所有用于对数值表达式进行求值的宏定义都应该在必要之处加上括号,避免在使用宏时,由于参数中的操作符或邻近的操作符之间不可预料的相互作用。如:
#define DOUBLE(x) ( (x) + (x))
65. 有些任务既可以用宏实现,也可以用函数实现,宏的一个优点是与类型无关,而且宏的执行速度快于函数,因为宏不存在函数调用、返回的开销。但是使用宏通常会增加程序的长度,但函数不会。另外,具有副作用的参数可能在宏的使用过程中产生不可预料的结果,而函数参数的行为更容易预测。
66. #pragma指令因编译器而异,允许编译器提供不标准的处理过程,比如向一个函数插入内联的汇编代码等。/*比如TI的C2000的DSP,可以用#pragma指令来产生用户定义的段,详见《CMD文件》*/
用户1776833 2014-10-14 10:54
//deleted
用户982829 2014-10-11 23:02