《C专家编程》的原文摘录

  • char* s 与 const char* p 相容,char **s 与 const char** p却不相容? 要使上述的赋值合法,必须满足下列条件之一: 1. 两个操作数都是指向有限定符或者无限定符的相容类型的指针; 2. 左边指针所指向的类型必须具有右边指针指向类型的全部限定符; const限定符是修饰指针所指向的类似,而不是指针本身。 类似地,cost char**也是一个没有限定符的指针类型。它的类型是“指向有const限定符的char类型的指针 的指针” (查看原文)
    月入窗 1赞 2012-06-30 14:07:13
    —— 引自第20页
  • const最有用的用法就是用它限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其它函数却可能会修改它。 (查看原文)
    月入窗 1赞 2012-06-30 14:07:13
    —— 引自第20页
  • 当内核检测到“不会出现”的情况时,他就会“惊慌失措”,引起突然停止。…… 为解决内核的“惊慌”问题,首先必须考虑有哪些事情有可能吓坏操作系统。 Sun 的内核开发小组有一个很隐蔽的 Bug,非常难以发现。其症状是内核的内存偶尔会被覆盖,这会使操作系统“惊慌”。 (查看原文)
    Grissiom 2011-02-14 10:51:01
    —— 引自第133页
  • 对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。你应该根据情况做出选择。 …… 为什么人们会错误地认为数组和指针是可以完全互换的呢?这是因为他们阅读了标准的参考文献! The C Programming Language,第二版,Kernihan & Ritchie,第 99 页的底部是: As format parameters in a function definition, 然后翻到第 100 页,紧接前句: char s[]; and char s*; are equivalent... 呜呼!真是不幸,这么重要的一句话竟然在 K&R 第二版中被分印在了两页上!人们在阅读后一句话时很容易忘掉它的前面还有一句“As format parameter in a function definition”(也就是说它只限于这种情况),尤其是整句话的重点在于“数组下标表达式总是可以改写为带偏移量的指针表达式”。 (查看原文)
    Grissiom 2011-02-15 11:24:10
    —— 引自第200页
  • const float *类型并不是一个具有限定符的类型——它的类型是“指向一个具有const限定符的float类型的指针”,也就是说const限定符是修饰指针所指向的类型,而不是指针本身。 (查看原文)
    2011-02-18 13:36:18
    —— 引自第20页
  • 关键字const并不能把变量变成常量!在一个符号前加上cosnt限定符只是表示这个符号不能被赋值。也就是它的值对于这个符号来说是只读的。 (查看原文)
    2011-02-18 13:51:46
    —— 引自第21页
  • static: 在函数内部,表示该变量的值在各个调用间一直保持延续性。 在函数这一级,表示该函数只对文件可见。 注:你可能会奇怪static的意义会相差如此之大,如果你知道原因,也请告诉我一声。(笔记者注:这句比较搞笑。) (查看原文)
    2011-02-18 13:55:48
    —— 引自第37页
  • chapter 2: It's not a bug,it's a language feature! (查看原文)
    耿老的竹林 2011-04-23 09:42:22
    —— 引自第3页
  • 这代表什么意思?是int的长度乘以p?或者是把未知类型的指针p强制转换为int,然后进行sizeof操作? (查看原文)
    timebug 2011-10-11 21:26:36
    —— 引自第38页
  • 没有办法把数组本身传递给一个函数,因为它总会被自动转换为指向数组的指针。当然,在函数内部使用指针,所能进行的对数组的操作几乎跟传递原原本本的数组没有差别。只不过,如果想用sizeof (实参)来获得数组的长度,所得到的结果不正确而已。 (查看原文)
    timebug 2011-10-16 15:23:50
    —— 引自第207页
  • goto 语句不能跳出c语言当前函数,这也是longjmp取名的由来,它可以跳得很远,甚至可以跳到其他文件的函数中 (查看原文)
    [已注销] 2012-01-20 12:53:58
    —— 引自第128页
  • C诡异离奇,缺陷重重,缺获得了巨大的成功。 C is quirky, flawed, and an enormous success. -- Dennis Ritchie (查看原文)
    游子 2012-05-08 09:38:30
    —— 引自第1页
  • 分析编程语言缺陷的一种方法就是把所有的缺陷归于3类:不该做的做了;该做的没做;该做但做得不合适。 (查看原文)
    游子 2012-05-08 13:20:45
    —— 引自第28页
  • NUL用于结束一个ASCII字符串 (查看原文)
    WilHelM 2012-06-09 07:45:35
    —— 引自第29页
  • NULL用于表示什么也不指向(空指针) (查看原文)
    WilHelM 2012-06-09 07:45:35
    —— 引自第29页
  • _asm mov ah, 2 _asm mov dl, 43h 可以在汇编代码前冠以关键字“_asm”,也可以只使用该关键字一次,把所有的汇编代码放入一对花括号内,如下: _asm { mov ah, 2 mov dl, 43h int 21h } (查看原文)
    WilHelM 2012-06-09 07:45:35
    —— 引自第136页
  • 对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。 (查看原文)
    fl 2012-06-12 15:44:25
    —— 引自第81页
  • 当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整型数如果转换为signed 不会丢失信息,就转换为signed,否则转换为unsigned。 (查看原文)
    张三 2012-06-19 21:19:24
    —— 引自第23页
  • 在这个位置上(指的是switch的左花括号之后)声明一些变量会被编译器很自然地接受,尽管在switch语句中为这些变量加上初始值是没有什么用处的,因为它绝不会被执行——语句从匹配表达式的case开始执行。 (查看原文)
    张三 2012-06-20 20:57:28
    —— 引自第30页
  • 除了递归调用之外,堆栈并非必需。因为在编译时可以知道局部变量、参数和返回地址所需空间的固定大小,并可以将它们分配于bss段。BASIC,COBOL和FORTRAN的早期编译器并不允许函数的递归调用,所以它们在运行时并不需要动态的堆栈。允许递归调用意味着必须找到一种方法,在同一时刻允许局部变量的多个实例存在,但只有最近被创建的那个才能被访问,这很像栈的经典定义。 (查看原文)
    张三 2012-06-23 10:20:45
    —— 引自第117页
<前页 1 2 3 后页>