Tangaoo an embedded software engineer

theCprogrammingLanguage 读书笔记

2021-07-19
tangoo

温故而知新,再次读 《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 例程还有疑问

Similar Posts

上一篇 protobuf

下一篇 开始用 Emacs

Comments