温故而知新,再次读 《theCprogrammingLanguage》决定做一些笔记。
-
P59页 逆波兰表示法计算器例程,这里用栈数据结构实现的,非常巧妙。
-
P63页 getch ungetch 利用一个额外的栈,解决这样一个公共问题”某些情况下,必须从数据流中多读出一些数据后,才能判断当次读入是否完整,但又要不影响下一次读入“
-
P65页 作用域,如果在同一个源文件里要先使用变量,在定义变量的话,也可以在使用之前进行 extern 声明。
-
P67页 寄存器变量
register int x;
不一定生效,但是加了没坏处。另外注意声明为寄存器变量后,它的地址不能被访问。 -
P70页 递归打印数字,也就是把一个整数字符串化。用递归实现很巧妙。递归并不节省内存,执行速度也并不快。
-
P73页 宏 有的是类似一种泛型,比如
#define max((x), (y)) (x) > (y) ? (x): (y)
可以应对任何简单数据类型。- 宏参数
- #
- ##
第 5 章
- P80页 数组类型的变量或者表达式的值是该数组第0个元素的地址,也就是:
- 数组名与指针唯一的不同是,指针是一个变量,而数组名不是。pa++ 没问题,但不能 a++。
char a[]
与char * a
等价。
int a[10];
int * pa;
pa = &a[0];
pa = a; // 这也是成立的,很少这样用
*(a + i) // 这样也是对的
pa[i] // 这样也是对的,实际上数组的下标访问是会被编译器转换成指针访问形式的
- P82页 用数组实现 malloc 和 free 的超级简单例子。在特殊情况下有可能用的着,但是它的调用顺序有如下限制:
- alloc(a) –> alloc(b) –> free(b) –> free(a)
- P85页 下面两个定义有巨大差异:
char amessage[] = "nw is the time"; /* 定义一个数组 */
char *pmessage = "now is the time"; /* 定义一个指针 */
amessage 是一个数组,数组中每个元素都可以修改;而pmessage是一个指针,指向字符串常量,之后可以被修改成其他变量,但是如果试图修改字符串内容,是未定义的。
- P92页 二维数组的在函数形参上的声明方法。
int f(int daytab[2][13]);
int f(int daytab[][13]);
int f(int (*daytab)[13]); // 这个写法比较怪异
- P101 C 语言复杂声明:
int *f(); /* f: function returning pointer to int */
int (*pf)(); /* pf: pointer to function returning int */
- P101 C 语言复杂声明 del 例程还有疑问