C专家编程
mylove10086
;ldfk
展开
-
C专家编程 二 const
关键字const并不能把变量变成常量!在一个符号前加上const限定符只是表示这个符号 不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚 至是外部)的方法来修改这个值。const最有用之处就是用它来限定函数的形参,这样该函数 将不会修改实参指针所指的数据,但其他的函数却可能会修改它。这也许就是C和C++中 const最一般的用法。const可以用在数据上,原创 2016-11-02 20:55:56 · 283 阅读 · 0 评论 -
C专家编程 十五 使用指针向函数传递一个多维数组
使用上一节所描述的笨拙方法,可以解决标记数组范围这个难题。但是还存在一个问题, 就是如何在函数内部声明一个二维数组参数,这才是真正的麻烦所在。C语言没有办法表达 “这个数组的边界在不同的调用中可以变化”这个概念。C编译器必须要知道数组的边界,以 便为下标引用产生正确的代码。从技术上说,也可以在运行时处理才知道数组的边界,而且很多其他语言就是这样做的,但这种做法违背了C语言的设计理念。原创 2016-11-15 10:57:22 · 508 阅读 · 0 评论 -
C专家编程 十四 为什么NULL指针会导致printf函数崩溃?
有一个经常被问到的问题是:“为什么向printf()函数传递一个NULL指针会导致程序的崩溃?”人们似乎觉得可以像下面这样编写代码:char *p = NULL;/*…*/printf("%sH, p); 并认为它不会崩溃。顾客们有时会抱怨:“它在我的HP/IBM/PC上不会崩溃。”他们希望当 printf()传入一个NULL指针时,它会打印出空字符串。原创 2016-11-15 10:52:44 · 1778 阅读 · 0 评论 -
C专家编程 一 K&R C
1978年,C语聲经典名著The C Programming Language 狀出版了。这本书受到了广泛的赞誉,其作者Brian Kemighan和Dennis Ritchie也因此名声大噪,所以这个版本的C语言就被称为“K&R C”原创 2016-11-02 19:25:18 · 328 阅读 · 0 评论 -
C专家编程 十三 数组和指针参数是如何被编译器修改的
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写为“数 组的指针”,而不是“指针的指针”。 你之所以能在main()函数中看到char **argv这样的数,是因为argv是个指针数组(即 char *argv[])。这个表达式被编译器改写为指向数组第一个元素的指针,也就是一个指向指针的指针。如果argv参敎事实上被声明为一个数组的数组(也就是cha原创 2016-11-14 20:16:42 · 267 阅读 · 0 评论 -
C专家编程 十二 C语言的多维数组
有些人声称C语言没有多维数组,这是不对的。ANSI C标准在第6.5.4.2节以及第69号脚注上表示:当几个“[]”修饰符连续出现时(方括号里面是数组的范围),就是定义一个多维数组。 但所有其他语言都把这称为“数组的数组” C语言的方法多少有点独特:定义和引用多维数组惟一的方法就是使用数组的数组。尽管C语言把数组的数组当作是多维数组,但不能把几个下标原创 2016-11-13 21:37:16 · 618 阅读 · 0 评论 -
C专家编程 十一 数组和指针可交换性的总结
1. 用a[i]这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a+l)这样的指 针访问。 2. 指针始终就是指针。它绝不可以改写成数组。你可以用下标形式访问指针,一般都是 指针作为函数参数时,而且你知道实际传递给函数的是一个数组。 3. 在特定的上下文中,也就是它作为函数的参数(也只有这种情况),一个数组的声明 可以看作是一个指针。作为函数参数的数组(原创 2016-11-13 19:50:54 · 237 阅读 · 0 评论 -
C专家编程 十 规则2: C语言把数组下标作为指针的偏移量(二)
把数组下标作为指针加偏移量足C语言从BCPL (C语言的祖先)继承过来的技巧。在人们的常规思维中,在运行时增加对C语言下标的范围检查是不切实际的。因为取下标操作只是表示将要访问该数组,但并不保证一定要访问。而且,程序员完全可以使用指针来访问数组,从而绕过下标操作符。在这种情况下,数组下标范围检测并不能检测所有对数组的访问的情况。事实上,下标范围检测被认为并不值得加入到C语言中。还有一种说法原创 2016-11-13 12:22:12 · 2617 阅读 · 0 评论 -
C专家编程 九 什么时候数组与指针相同(一)
在实际应用中,数组和指针可以丸换的情形要比两者不吋彳 换的情形更为常见。让我们分别考虑“声明”和“使用”(使用它们传统的自:接作义)这两 种情况。声明本身还可以进一步分成3种情况:•外部数组(external array)的声明。•数组的定义(记住,定义是声明的一种特殊情况,它分配内存冷间,许可能提供一个 初始值)。•函数参数的声明。 所有作为函数参数的数组名总是原创 2016-11-12 20:20:14 · 438 阅读 · 0 评论 -
C专家编程 十六 从C转换到C++
学习C++最好的方式就是从它的ANSI C子集开始编程。避免使用早期基于CFront的编译器,它所产生的是C代码而不是机器代码。把C语言作为一种可移植的机器语言事实上会使链接和调试复杂化,因为CFront把所有的函数名字混合在一起,为参数信息编写内部代码。名字混合并不可靠,它会带来可怕的危险,并可能长期存在于C++中。与C++相反,Ada对这个问题的处理非常得体,而且它并不使用不正规的实现方法来定原创 2016-11-16 12:56:01 · 335 阅读 · 0 评论 -
//捕捉段错误信号的信号处理程序
//捕捉段错误信号的信号处理程序#include#include#includejmp_buf buf;void handler(int s){if (s == SIGBREAK) printf (" now got a bus error signal\n");if (s == SIGSEGV) printf(" now got a segmentati原创 2016-11-11 14:12:32 · 678 阅读 · 0 评论 -
C专家编程 八 函数库链接的時特殊秘密
当使用函数库时,需要掌握5个基本的、不明显的约定。绝大多数C语言书籍或手册对 此并没有作出清楚的解释。这可能是因为编程语言的文档认为链接是操作系统的一部分.但 是,设计操作系统的人们《认为链接是语言的一部分。结果,除非是链接器开发队伍的人参 与进来,否则人们顶多也就偶尔提到它一下。这里展示了关于UNIX链接的真实情况:1. 动态库文件的扩展名是“.so”,而静态库文件的扩展名是“.a”原创 2016-11-05 11:35:20 · 251 阅读 · 0 评论 -
C专家编程 七 动态链接的优点
动态链接是一种更为现代的方法,它的优点是可执行文件的体积可以非常小。虽然运行 速度稍慢一些,但动态链接能够更加有效地利用磁盘空间,而且链接-编辑阶段的时间也会缩 短(因为链接器的有些工作被推迟到载入时)。动态链接的目的之一是ABI 动态链接的主要目的就是把程序与它们使用的特定的函数库版本中分离开来。取而代之 的是,我们约定由系统向租序提供一个接口,该接口保持稳定,不随原创 2016-11-04 20:20:21 · 326 阅读 · 0 评论 -
C专家编程 六 typedef
typedef是一种有趣的声明形式:它为一种类型引入新的名字,而不是为变量分配空间。 在某些方面,typedef类似于宏文本替换——它并没有引入新类型,而是为现有类型取个新名 字,但它们之间存在一个关键性的区别,容我稍后解释。 如果现在回过头去看看“声明是如何形成的”那一节,会发现typedef关键字可以是一个 常规声明的一部分,可以出现在靠近声明开始部分的任何地方。事实上,ty原创 2016-11-04 10:02:21 · 320 阅读 · 0 评论 -
C专家编程 五 声明的优先级规则
到现在为止,我们已经回顾了声明的各个组成部分。本节描述了一种方法,用通俗的语 言把声明分解开来,分别解释各个组成部分。要理解一个声明,必须要懂得其中的优先级规 则,语言律师们最喜欢这种形式,它高度简洁,可惜极不直观。理解C语言声明的优先级规则A 声明从它的名字开始读取,然后按照优先级顺序依次读取。B 优先级从高到低依次是:B. 1声明中被括号括起原创 2016-11-03 21:03:39 · 313 阅读 · 0 评论 -
C专家编程 四 关于结构
结构就是一种把一些数据项组合在一起的数据结构。其他编程语言把它称为记录 (record)。结构的语法很容易记忆:在C语言中,进行组合的通常方法就是把需要组合的东西 放在花括号里面:{内容〃}。关键字struct放在左花括号前面,以便编译器能够从程序块中认 出它:struct {内容..• } 结构的内容可以是任何其他数据声明:单个数据项、数组、其他结构、指针等。我们可原创 2016-11-03 20:39:55 · 219 阅读 · 0 评论 -
C专家编程 三 C语言声明是如何形成的
C语言声明是如何形成的 让我们先来看一些c语言的术语以及一些能组合成一个声明的牟.独语法成份。其中一个 非常重要的成份就是声明器(declarator)——它是所有声明的核心。简单地说,声明器就是标 识符以及与它组合在一起的任何指针、函数括号、数组下标等,如表3-1所示。为方便起见, 我们把初始化内容(initializer)也放到里面,并分类表示。原创 2016-11-03 20:15:33 · 435 阅读 · 0 评论 -
C专家编程 十六 抽象——取事物的本质特性
面向对象编程从面向对象设计开始,而面向对象设计从抽象开始。什么是“对象”?请使用我们新发现的技巧“抽象”,考虑一下现实世界事物的相似之处,如一辆小汽车和一个软件。在软件中,抽象是非常有用的,因为它允许程序 员实现下列目标:•隐藏不相关的细节,把注意力集中在本质特征上。 •向外部世界提供一个“黑盒子”接口。接口确定了施加在对象之上的有效操作的集合, 但它并不提示原创 2016-11-15 19:23:26 · 254 阅读 · 0 评论