今天花了一下午的时间把这本书看完了,也就150来页,当做是对C的一次复习,当然也发现了以前薄弱的地方。薄薄的一本书,对每一段代码都讲解的很详细,而且针对的都是C程序员较易犯错的地方,用的都是简单的例子,推荐初、中级C程序员好好研读(PS:每一页的插图都还很有意思,都是一些经典的视错觉图像).
-
在对替换字符串里的宏进行扩展之前,C语言预处理器将先对“#”和“##”操作符进行处理。“##”操作符将合并它的两个操作数。
-
宏越简单越好。如果无法得到一个简单的宏,就应该把它定义成一个函数。
char *c[]={"ENTER","NEW","POINT","FIRST"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
**++cpp
*--*++cpp+3
*cpp[-2]+3
cpp[-1][-1]+1
- 如上,是关于指针操作的,如果能正确理解,对掌握指针的用法很有帮助。
*c[]
将被求值为一个char
,所以c[]
会指向一个char
数组,而c
是一个以char
指针为元素的数组.c
中的元素被初始化为分别指向char
数组”ENTER”、”NEW”、”POINT”和”FIRST”。
**cp[]
将被求值为一个char
,*cp[]
是一个char
指针,而cp[]
是一个指向一个char
指针的指针。cp
是一个以char
指针为元素的数组。cp
的元素被初始化为分别指向c
的各个元素。
***cpp
将被求值为一个char,**cpp
指向一个char
,*cpp
指向一个char
指针,而cpp
指向一个char
指针的指针。
对上面四个式子的分析如下:
- 先对
cpp
进行递增,再使用该指针 - 先对
cpp
进行递增并通过该指针找到cp[2]
,然后对cp[2]
进行递减并通过该指针找到c[0]
,最后给c[0]
里的地址加上3。 - 先从
cpp
开始根据偏移量-2找到cp[0]
,再沿着该指针找到c[3]
,最后给c[3]
里的地址加上3. - 先从
cpp
开始根据偏移量-1找到cp[1]
,再从cp[1]
开始根据偏移量-1找到c[1]
,最后给c[1]里的地址加上1.
以上四个式子的结果分别是:POINT ER ST EW