CSDN-CSDN社区-C/C++-C语言

收藏 本人新书出炉,欢迎大家下载:C语言深度解剖(解开程序员面试笔试的秘密)--------以含金量勇敢挑战国内外同类书籍[问题点数:100]

  • dissection_c
  • (dissection_c)
  • 等 级:
  • 结帖率:
楼主发表于:2009-06-30 22:37:16
本书下载地址:http://download.csdn.net/source/1452137



   

    C语言深度解剖



                               

                                  ----------解开程序员面试笔试的秘密















以含金量勇敢挑战国内外同类书籍

























陈正冲  编著

石  虎  审阅

















版权申明 

    本书尚未出版,先放到网上给大家免费下载和阅览。本书正式出版前读者可以仔细研读和自由传阅本书电子版,但不允许私自大量印刷和销售。出版社如想出版此书可通过邮件或博客留言联系作者商谈出版事宜。

    对于非法盗印或盗版,作者将本着愚公移山的精神,孜孜不倦的与盗版者周旋,直至法律做出公正的裁决。           









写在前言前面的话

    最近面试了一些人,包括应届本科、硕士和工作多年的程序员,在问到C语言相关的问题的时候,总是没几个人能完全答上我的问题。甚至一些工作多年,简历上写着 “最得意的语言是C语言”,“对C有很深的研究”,“精通C语言”的人也答不完全我的问题,甚至有个别人我问的问题一个都答不上。于是我就想起了我去年闲的使用写的这本小册子。

这本小册子已经在我电脑里睡了一年大觉了。并非没有出版社愿意出版,而是几个大的出版社都认为书写得不错,但太薄,利润太低,所以要求我加厚到300页以上。我拒绝加厚,并为此和几个出版社僵持了一年多。我认为经典的东西一定要精炼,不要废话。这次由于面试别人,所以终于记起了我还写过这么一本小册子。想了想,还是决定挂到网上免费让大家看得了。并为此专门为本书开了个博客,以方便和读者交流。博客地址: http://blog.csdn.net/dissection_c 

作者简介:

陈正冲:湖南沅江人,毕业于长春光学精密机械学院 (长春理工大学) 数学系。目前从事嵌入式软件开发和管理方面的工作。

石虎:湖南沅江人,毕业于吉林大学计算机系。目前为大连交通大学计算机系讲师。

















前  言

    我遇到过很多程序员和计算机系毕业的学生,也给很多程序员和计算机系毕业的学生讲解过《高级C 语言程序设计》。每期班开课前,我总会问学生:你感觉 C 语言学得怎么样?难吗?指针明白吗?数组呢?内存管理呢?往往学生回答说:感觉还可以, C 语言不难,指针很明白,数组很简单,内存管理也不难。一般我会再问一个问题:通过这个班的学习,你想达到什么程度?很多学生回答:精通 C 语言。我告诉他们:我很无奈,也很无语。因为我完全在和一群业余者或者是 C 语言爱好者在对话。你们大学的计算机教育根本就是在浪费你们的时间,念了几年大学,连 C 语言的门都没摸着。现在大多数学校计算机系都开了 C 、 C++ 、 Java 、 C# 等等语言,好像什么都学了,但是什么都不会,更可悲的是有些大学居然取消了 C 语言课程,认为其过时了。我个人的观点是“十鸟在林,不如一鸟在手”,真正把 C 语言整明白了再学别的语言也很简单,如果 C 语言都没整明白,别的语言学得再好也是花架子,因为你并不了解底层是怎么回事。当然我也从来不认为一个没学过汇编的人能真正掌握 C 语言的真谛。我个人一直认为,普通人用 C 语言在 3 年之下,一般来说,还没掌握 C 语言; 5 年之下,一般来说还没熟悉 C 语言; 10 年之下,谈不上精通。所以,我告诉我的学生:听完我的课,远达不到精通的目标,熟悉也达不到,掌握也达不到。那能达到什么目标? ----- 领你们进入 C 语言的大门。入门之后的造化如何在于你们自己。不过我可以告诉你们一条不是捷径的捷径:把一个键盘的 F10 或 F11 按坏,当然不能是垃圾键盘。

    往往讲到这里,学生眼里总是透露着疑虑。C 语言有这么难吗?我的回答是:不难。但你就是用不明白。学生说:以前大学老师讲 C 语言,我学得很好。老师讲的都能听懂,考试也很好。平时练习感觉自己还不错,工作也很轻松找到了。我告诉学生:听明白,看明白不代表你懂了,你懂了不代表你会用了,你会用了不代表你能用明白,你能用明白不代表你真正懂了!什么时候表明你真正懂了呢?你站在我这来,把问题给下面的同学讲明白,学生都听明白了,说明你真正懂了。否则,你就没真正懂,这是检验懂没懂的唯一标准。冰山大家都没见过,但总听过或是电影里看过吧?如果你连《泰坦尼克》都没看过,那你也算个人物(开个玩笑)。《泰坦尼克》里的冰山给泰坦尼克造成了巨大的损失。你们都是理工科的,应该明白冰山在水面上的部分只是总个冰山的 1/8 。我现在就告诉你们, C 语言就是这座冰山。你们现在仅仅是摸到了水面上的部分,甚至根本不知道水面下的部分。我希望通过我的讲解,让你们摸到水面下的部分,让你们知道 C 语言到底是什么样子。

    从现在开始,除非在特殊情况下,不允许用printf 这个函数。为什么呢?很多学生写完代码,直接用 printf 打印出来,发现结果不对。然后就举手问我 : 老师,我的结果为什么不对啊?连调试的意识都没有!大多数学生根本就不会调试,不会看变量的值,内存的值。只知道 printf 出来结果不对,却不知道为什么不对,怎么解决。这种情况还算好的。往往很多时候 printf 出来的结果是对的,然后呢,学生也理所当然的认为程序没有问题。是这样吗?往往不是,往后看,你能看到例子的。永远给我记住一点:结果对,并不代表程序真正没有问题。所以,以后尽量不要用 printf 函数,要去看变量的值,内存的值。当然,在我们目前的编译器里,变量的值,内存的值对了就代表你程序没问题吗?也不是,往后,你也会看到例子的。

    这个时候呢,学生往往会莫名其妙。这个老师有问题吧。大学里我们老师都教我们怎么用printf ,告诉我们要经常用 printf 。这也恰恰是大学教育失败的地方之一。很多大学老师根本就没真正用 C 语言写过几行代码,更别说教学生调试代码了。不调试代码,不按 F10 或 F11 ,水平永远也无法提上来,所以,要想学好一门编程语言,最好的办法就是多调试。你去一个软件公司转转,去看人家的键盘,如果发现键盘上的 F10 或 F11 铮亮铮亮,毫无疑问,此机的主人曾经或现在是开发人员(这里仅指写代码的,不上升到架构设计类的开发人员),否则,必是非开发人员。

    非常有必要申明,本人并非什么学者或是专家,但本人是数学系毕业,所以对理论方面比较擅长。讲解的时候会举很多例子来尽量使学生明白这个知识点,至于这些例子是否恰当则是见仁见智的问题了。但是一条,长期的数学训练使得本人思维比较严谨,讲解一些知识点尤其是一些概念性原理性的东西时会抠的很细、很严,这一点相信读者会体会得到的。本书是我平时讲解C 语言的一些心得和经验,其中有很多我个人的见解或看法。经过多期培训班的实践,发现这样讲解得比较透彻,学生听得明白。很多学生听完课后告诉我:我有生以来听课从来都没有听得这么透彻,这么明白过。也有业余班的学生甚至辞掉本职工作来听我的课的。

    当然,关于C 语言的这么多经验和心得的积累并非我一人之力。借用一句名言:我只不过是站在巨人的肩膀上而已。给学生做培训的时候我参考得比较多的书有: Kernighan & Ritchie 的《 The C P rogramming  Language》; Linden 的《 Expert C Programming 》;  Andrew & Koening 《 C Traps and Pitfalls 》;  Steve Maguire 的《 Write Clean Code 》; Steve McConnell 的《 Code  Complete.  Second  Edition 》;林锐的《高质量C++/C 编程指南》。这些书都是经典之作,但却都有着各自的缺陷。读者往往需要同时阅读这些书才能深刻的掌握某一知识点。我的讲课的试图时候融各家之长,再加上我个人的见解传授给学生。还好,学生反映还可以,至少还没有出乱子。这些书饱含着作者的智慧,每读一遍都有不同的收获,我希望读者能读上十遍。另外,在编写本书时也参考了网上一些无名高手的文章,这些高手的文章见解深刻,使我受益匪浅。这里要感谢这些大师们,如果不是他们,肯怕我的 C 语言的水平也仅仅是入门而已。

    学习C 语言,这几本书如果真正啃透了,水平不会差到哪。与其说本书是我授课的经验与心得,不如说本书是我对这些大师们智慧的解读。本书并不是从头到尾讲解 C 语言的基础知识,所以,本书并不适用于 C 语言零基础的人。本书的知识要比一般的 C 语言书说讲的深的多,其中有很多问题是各大公司的面试或笔试题。所以本书的读者应该是中国广大的计算机系的学生和初级程序员。如果本书上面的问题能真正明白 80% ,作为一个应届毕业生,肯怕没有一家大公司会拒绝你。当然,书内很多知识也值得计算机教师或是中高级程序员参考。尤其书内的一些例子或比方,如果能被广大教师用于课堂,我想对学生来说是件非常好的事情。有人说电影是一门遗憾的艺术,因为在编辑完成之后总能或多或少的发现一些本来可以做得更好的缺陷。讲课同样也如此,每次讲完课之后总能发现自己某些地方或是没有讲到,或是没能讲透彻或是忘了举一个轻浅的例子等等。整理本书的过程也是,为了尽量精炼,总是犹豫一些东西的去留。限于作者水平,书中难免有些遗漏甚至错误,希望各位读者能予指教。作者 Mail: dissection_c@163.com .



                                                        陈正冲

                                                        2008年 6 月 23 日









目      录

第一章 关键字 9

1.1,最宽恒大量的关键字 ----auto 11

1.2,最快的关键字 ---- register 11

1.2.1,皇帝身边的小太监 ---- 寄存器 11

1.2.2,使用 register 修饰符的注意点 11

1.3,最名不符实的关键字 ----static 12

1.3.1,修饰变量 12

1.3.2,修饰函数 13

1.4,基本数据类型 ----short 、 int 、 long 、 char 、 float 、 double 13

1.4.1,数据类型与 “ 模子 ” 14

1.4.2,变量的命名规则 14

1.5,最冤枉的关键字 ----sizeof 18

1.5.1,常年被人误认为函数 18

1.5.2, sizeof ( int ) *p 表示什么意思? 18

1.4, signed 、 unsigned 关键字 19

1.6, if 、 else 组合 20

1.6.1, bool 变量与 “ 零值 ” 进行比较 20

1.6.2, float变量与 “ 零值 ” 进行比较 21

1.6.3,指针变量与 “ 零值 ” 进行比较 21

1.6.4, else 到底与哪个 if 配对呢? 22

1.6.5, if 语句后面的分号 23

1.6.6,使用 if 语句的其他注意事项 24

1.7, switch 、 case 组合 24

1.7.1,不要拿青龙偃月刀去削苹果 24

1.7.2, case 关键字后面的值有什么要求吗? 25

1.7.3, case 语句的排列顺序 25

1.7.4,使用 case 语句的其他注意事项 27

1.8, do 、 while 、 for 关键字 28

1.8.1, break 与 continue 的区别 28

1.8.2,循环语句的注意点 29

1.9, goto 关键字 30

1.10, void 关键字 31

1.10.1, void  a ? 31

1.10, return 关键字 34

1.11, const 关键字也许该被替换为 readolny 34

1.11.2,节省空间,避免不必要的内存分配,同时提高效率 35

1.12,最易变的关键字 ----volatile 36

1.13,最会带帽子的关键字 ----extern 37

1.14, struct 关键字 38

1.14.1,空结构体多大? 38

1.14.2,柔性数组 39

1.14.3, struct 与 class 的区别 40

1.15, union 关键字 40

1.15.1,大小端模式对 union 类型数据的影响 40

1.15.2,如何用程序确认当前系统的存储模式? 41

1.16, enum 关键字 42

1.16.1, 枚举类型的使用方法 43

1.16.2,枚举与 #define 宏的区别 43

1.17,伟大的缝纫师 ----typedef 关键字 44

1.17.1,关于马甲的笑话 44

1.17.2,历史的误会 ---- 也许应该是 typerename 44

1.17.3, typedef 与 #define 的区别 45

1.17.4, #define a int[10] 与 typedef int a[10] ; 46

第二章 符号 49

2.1,注释符号 50

2.1.1,几个似非而是的注释问题 50

2.1.2, y = x/*p 51

2.1.3,怎样才能写出出色的注释 51

2.1.3.1,安息吧,路德维希 . 凡 . 贝多芬 51

2.1.3.2, windows 大师们用注释讨论天气问题 51

2.1.3.3,出色注释的基本要求 52

2.2,接续符和转义符 53

2.3,单引号、双引号 54

2.4,逻辑运算符 54

2.5,位运算符 55

2.5.1,左移和右移 55

2.5.2, 0x01 < <2+3 的值为多少? 55

2.6,花括号 56

2.7, ++ 、 -- 操作符 56

2.7.1, ++i+++i+++i 57

2.7.2,贪心法 57

2.8, 2/(-2) 的值是多少? 58

2.9,运算符的优先级 58

2.9.1, 运算符的优先级表 58

2.9.2,一些容易出错的优先级问题 60

第三章 预处理 61

3.1,宏定义 62

3.1.1,数值宏常量 62

3.1.2,字符串宏常量 62

3.1.3,用 define 宏定义注释符号? 63

3.1.4,用 define 宏定义表达式 63

3.1.5,宏定义中的空格 64

3.1.6, #undef 64

3.2,条件编译 65

3.3,文件包含 66

3.4, #error 预处理 66

3.5, #line 预处理 67

3.6, #pragma 预处理 67

3.6.8, #pragma pack 69

3.6.8.1,为什么会有内存对齐? 70

3.6.8.2,如何避免内存对齐的影响 70

3.7, #运算符 72

3.8, ## 预算符 72

第四章 指针和数组 74

4.1,指针 74

4.1.1,指针的内存布局 74

4.1.2, “*” 与防盗门的钥匙 75

4.1.3, int *p = NULL 和 *p = NULL  有什么区别? 75

4.1.4,如何将数值存储到指定的内存地址 76

4.1.5,编译器的 bug ? 77

4.1.6,如何达到手中无剑、胸中也无剑的地步 78

4.2,数组 78

4.2.1,数组的内存布局 78

4.2.3,数组名 a 作为左值和右值的区别 79

4.3,指针与数组之间的恩恩怨怨 80

4.3.1,以指针的形式访问和以下标的形式访问 80

4.3.1.1,以指针的形式访问和以下标的形式访问指针 81

4.3.1.2,以指针的形式访问和以下标的形式访问数组 81

4.3.2, a 和 &a 的区别 81

4.3.3,指针和数组的定义与声明 83

4.3.3.1,定义为数组,声明为指针 83

4.3.3.2,定义为指针,声明为数组 85

4.3.4,指针和数组的对比 85

4.4,指针数组和数组指针 86

4.4.1,指针数组和数组指针的内存布局 86

4.4.3,再论 a 和 &a 之间的区别 87

4.4.4,地址的强制转换 88

4.5,多维数组与多级指针 90

4.5.1,二维数组 91

4.5.1.1,假想中的二维数组布局 91

4.5.1.2,内存与尺子的对比 91

4.5.1.3, &p[4][2] - &a[4][2] 的值为多少? 92

4.5.2,二级指针 93

4.5.2.1,二级指针的内存布局 93

4.6,数组参数与指针参数 94

4.6.1,一维数组参数 94

4.6.1.1,能否向函数传递一个数组? 94

4.6.1.2,无法向函数传递一个数组 96

4.6.2,一级指针参数 97

4.6.2.1,能否把指针变量本身传递给一个函数 97

4.6.2.2,无法把指针变量本身传递给一个函数 98

4.6.3,二维数组参数与二维指针参数 99

4.7,函数指针 100

4.7.1,函数指针的定义 100

4.7.2,函数指针的使用 101

4.7.2.1,函数指针使用的例子 101

4.2.7.2, *(int*)&p ---- 这是什么? 102

4.7.3, (*(void(*) ())0)()------ 这是什么? 102

4.7.4,函数指针数组 103

4.7.5,函数指针数组的指针 104

第五章 内存管理 107

5.1,什么是野指针 107

5.2,栈、堆和静态区 107

5.3,常见的内存错误及对策 108

5.3.1,指针没有指向一块合法的内存 108

5.3.1.1,结构体成员指针未初始化 108

5.3.1.2,没有为结构体指针分配足够的内存 109

5.3.1.3,函数的入口校验 109

5.3.2,为指针分配的内存太小 110

5.3.3,内存分配成功,但并未初始化 110

5.3.4,内存越界 111

5.3.5,内存泄漏 111

5.3.5.1,告老还乡求良田 112

5.3.5.2,如何使用 malloc 函数 112

5.3.5.3,用 malloc 函数申请 0 字节内存 113

5.3.5.4,内存释放 113

5.3.5.5,内存释放之后 114

5.3.6,内存已经被释放了,但是继续通过指针来使用 114

第六章 函数 115

6.1,函数的由来与好处 116

6.2,编码风格 116

6.2,函数设计的一般原则和技巧 121

6.4,函数递归 123

6.4.1,一个简单但易出错的递归例子 123

6.4.2,不使用任何变量编写 strlen 函数 124

第七章  文件结构 127

7.1,文件内容的一般规则 127

7.2,文件名命名的规则 130





本书下载地址:http://download.csdn.net/source/1452137
回复次数:280
#1楼 得分:0回复于:2009-06-30 22:49:56
看看
  • HL4567用户头像
  • HL4567
  • (HL4567)
  • 等 级:
#2楼 得分:0回复于:2009-06-30 22:53:05
瞧瞧
#3楼 得分:0回复于:2009-06-30 22:56:24
看目录,貌似对C本身的语言特性讲得很深啊,支持!现在国内大部书都是追求速成,取个牛叉无比的名字,说什么多少多少天精通之类,却是落了下乘。祝楼主能成功!下来看看先。Bless!
  • Nio96用户头像
  • Nio96
  • (Nio96)
  • 等 级:
#4楼 得分:0回复于:2009-06-30 22:56:29
看看
#5楼 得分:0回复于:2009-06-30 22:57:51
看看
#6楼 得分:0回复于:2009-06-30 22:58:08
那个网址为虾米偶打不开涅。。。。
#7楼 得分:0回复于:2009-06-30 22:59:48
确实不用太厚,C标准也不超过200页。
#8楼 得分:0回复于:2009-06-30 23:01:17
在下载频道搜索一下能找到,咔咔
  • wxdcxp用户头像
  • wxdcxp
  • (果冻)
  • 等 级:
#9楼 得分:0回复于:2009-06-30 23:03:15
看完你的前言,下载下来看看
  • HL4567用户头像
  • HL4567
  • (HL4567)
  • 等 级:
#10楼 得分:0回复于:2009-06-30 23:07:16
引用 2 楼 HL4567 的回复:
瞧瞧
有点意思!
#11楼 得分:0回复于:2009-06-30 23:10:27
自己写的?东西还不错
  • fetag用户头像
  • fetag
  • (孤独过儿)
  • 等 级:
#12楼 得分:0回复于:2009-06-30 23:20:44
建议你把书名改一下,看了下目录,都是基本的知识点,还谈不上深度剖析,至于挑战国内外同类书籍就更是大话了...

C本身的语法不难,但是面试的时候,基于C的问题可以放倒任何人,LZ你知道为什么吗?
#13楼 得分:0回复于:2009-06-30 23:23:25
顶一下
#14楼 得分:0回复于:2009-06-30 23:41:47
用来面试
#15楼 得分:0回复于:2009-06-30 23:55:15
恭喜楼主写成了新书!下载了拜读,特意看了一下数组与指针部分,之所以特意看这个是由于国内很多书自谭浩强开始都在这个问题上弄得一塌糊涂。

关于&a[0]和&a意义,指出&a[0]不是数组首地址是一大进步了,国内很多书在这问题上错得离谱,以为&a[0]是数组首地址。

但&a是数组首地址吗???觉得笔者应该重新思考一下这个问题。对于int a[N]来说,&a的类型是什么?是int*,这是什么?一个指向int对象的指针!

试问一下,一个指向int对象的指针如何能成为一个数组对象的首地址???作为数组对象的首地址,它应该具有什么类型??不用说是数组类型!!谁才具有数组

类型?是a!!,a的类型是int[N],只有它才可称为数组首地址。


关于左值与右值的定义太简单化了,出现在赋值表达式的左边还是右边只是左值和右值最原始的涵义,现在c标准是从对象的角度去阐述这个问题的。

数组名a不是不能作为左值,其实它就是一个左值,只不过是一个不可修改的左值,它不是因为不能作为左值而不能放在赋值运算符左边,而是因为不可修改这个

原因,这是有很大区别的。
#16楼 得分:0回复于:2009-07-01 00:04:34
看目录内容应该不错。不过也都是基础知识点。同意12楼的意见,深度剖析恐怕还算不上。感谢楼主奉献的大作。学习C的人越来越多,但真正使用它能写简洁优雅的代码的人实在太少了。希望楼主的书能给更多想成为优秀的C程序员的人以良好的启示,而不仅仅是应付面试。
#17楼 得分:0回复于:2009-07-01 00:24:57
不好意思,写得匆忙,关于&a的类型写错了,那段话应改为这样:


但&a是数组首地址吗???觉得笔者应该重新思考一下这个问题。对于int a[N]来说,&a的类型是什么?是int(*)[N],这是什么?一个指向具有N个int元素的

数组的指针! 试问一下,一个指针如何能成为一个数组对象的首地址???作为数组对象的首地址,它应该具有什么类型??不用说是数组类型!!谁才具有数组

类型?是a!!,a的类型是int[N],只有它才可称为数组首地址。
#18楼 得分:0回复于:2009-07-01 00:45:41
感谢分享!
#19楼 得分:0回复于:2009-07-01 00:50:09
强烈支持,多谢分享!
  • liushac用户头像
  • liushac
  • (地球是个梨子)
  • 等 级:
#20楼 得分:0回复于:2009-07-01 00:57:01
下载了,正在看
  • liushac用户头像
  • liushac
  • (地球是个梨子)
  • 等 级:
#21楼 得分:0回复于:2009-07-01 00:58:10
错误的加密词典
  • lin_style用户头像
  • lin_style
  • (JAVA卧底、二分流掌门人)
  • 等 级:
#22楼 得分:0回复于:2009-07-01 00:59:35
引用 12 楼 fetag 的回复:
建议你把书名改一下,看了下目录,都是基本的知识点,还谈不上深度剖析,至于挑战国内外同类书籍就更是大话了...

C本身的语法不难,但是面试的时候,基于C的问题可以放倒任何人,LZ你知道为什么吗?


不知道。。。
就像我这样好奇的感觉一样,经久不衰?
#23楼 得分:0回复于:2009-07-01 01:11:07
引用 22 楼 lin_style 的回复:
引用 12 楼 fetag 的回复:
建议你把书名改一下,看了下目录,都是基本的知识点,还谈不上深度剖析,至于挑战国内外同类书籍就更是大话了...

C本身的语法不难,但是面试的时候,基于C的问题可以放倒任何人,LZ你知道为什么吗?


不知道。。。
就像我这样好奇的感觉一样,经久不衰?


我觉得是跟C与底层相关太贴近有关系,
#24楼 得分:0回复于:2009-07-01 08:47:53
关于C语言没有什么好跟LZ讨论的,但是纠正LZ的一个论述:
冰山一角占整个冰山的十分之一,占水下的九分之一。
  • zjf30366用户头像
  • zjf30366
  • (哥寂寞啊。)
  • 等 级:
#25楼 得分:0回复于:2009-07-01 09:16:12
谢谢。
  • dxhsir用户头像
  • dxhsir
  • (dxhsir)
  • 等 级:
#26楼 得分:0回复于:2009-07-01 09:22:54
谢谢辛苦劳动与无私分享,现在的出版社有眼光的太少了,再多联系几家吧,不要明珠投暗了。
#27楼 得分:0回复于:2009-07-01 09:23:42
好书
  • zjf30366用户头像
  • zjf30366
  • (哥寂寞啊。)
  • 等 级:
#28楼 得分:0回复于:2009-07-01 09:24:55
刚下下来大体看了一下,感觉不是很深入,但是很易懂。
#29楼 得分:0回复于:2009-07-01 09:29:41
已经下载,有时间看看,顶一下!
#30楼 得分:0回复于:2009-07-01 09:33:33
顶,原创咱得顶!
#31楼 得分:0回复于:2009-07-01 09:35:56
看看
#32楼 得分:0回复于:2009-07-01 09:39:14
顶一个,楼主还是很用心的
#33楼 得分:0回复于:2009-07-01 09:59:25
多谢了!12,15等几楼的兄弟能不能写的详细点???!
#34楼 得分:0回复于:2009-07-01 10:05:51
来拜一下牛人
#35楼 得分:0回复于:2009-07-01 10:06:15
多谢分享,先看看
#36楼 得分:0回复于:2009-07-01 10:12:09
刚看了下,写的很深刻,回去好好学习。谢谢楼主。
  • hynwpu用户头像
  • hynwpu
  • (古月)
  • 等 级:
#37楼 得分:0回复于:2009-07-01 10:23:54
下下来看看,多谢楼主了。赞一个!
#38楼 得分:0回复于:2009-07-01 10:24:17
哈哈哈 买书的啊
#39楼 得分:0回复于:2009-07-01 10:24:33
谢谢
#40楼 得分:0回复于:2009-07-01 10:31:23
确实,menu看起来不错,下载下看看,言谢啦。
#41楼 得分:0回复于:2009-07-01 11:32:07
谢谢分享
#42楼 得分:0回复于:2009-07-01 11:39:22
顶一下……
#43楼 得分:0回复于:2009-07-01 11:51:53
先不管别的,就冲着楼主的奉献精神就顶你!

#44楼 得分:0回复于:2009-07-01 11:52:51
看了下,很精彩,
#45楼 得分:0回复于:2009-07-01 11:53:02
顶一个
#46楼 得分:0回复于:2009-07-01 12:04:59
马上下载来看
#47楼 得分:0回复于:2009-07-01 12:45:26
稍稍翻了一遍,楼主写的不错哦,不过确实感觉页数有些少,传统意义上似乎构不成书的要求,呵呵,楼主继续加油,顶一个!
  • jeff_nie用户头像
  • jeff_nie
  • (多C多漂亮!)
  • 等 级:
#48楼 得分:0回复于:2009-07-01 12:48:03
支持
  • kendy_ke用户头像
  • kendy_ke
  • (迷茫的小羔羊)
  • 等 级:
#49楼 得分:0回复于:2009-07-01 12:49:41
楼主 ,莫非就是 我当年叱咤风云的.....

大牛....
哈哈 ,谢谢了!
#50楼 得分:0回复于:2009-07-01 13:01:08
看看
#51楼 得分:0回复于:2009-07-01 13:07:58
我倒想看看楼主有多NB,楼主请回答下我的问题:
C/C++ code
# include<iostream> using namespace std; int main() { char P[] = "I love china"; char *pp = P; cout<<pp; char (*ppp)[13] = &P; cout<<*ppp; return 0; }

在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个却需取指针里的内容?
#52楼 得分:0回复于:2009-07-01 13:11:05
看看
#53楼 得分:0回复于:2009-07-01 14:20:16
兄台,你拿这个问题
估计有点鄙视搂主的味道

既然敢出这样的书,应该是没有问题的
#54楼 得分:0回复于:2009-07-01 15:03:42
已下载,多谢!!
#55楼 得分:0回复于:2009-07-01 15:19:40
1.1,最宽大量的关键字 ----auto 11
->
大量

拜读
  • wxgiter用户头像
  • wxgiter
  • (台式机,想换笔记本...)
  • 等 级:
#56楼 得分:0回复于:2009-07-01 15:21:53
帮顶,下载来学习
  • fbzok用户头像
  • fbzok
  • (fbz)
  • 等 级:
#57楼 得分:0回复于:2009-07-01 15:30:40
引用 51 楼 maolisheng1985 的回复:
我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include <iostream>
using namespace std;
int main()
{

char P[] = "I love china";
char *pp = P;
cout < <pp;
char (*ppp)[13] = &P;
cout < <*ppp;
return 0; }


在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个却需取指针里的内容?


你这题目也太简单了吧。。。&P当然是要与*ppp配对了。char (*ppp)[13]只不过是一个指向13个元素的数组指针,要赋值你当然要取地址&。
#58楼 得分:0回复于:2009-07-01 15:39:29
感谢楼主!
  • fbzok用户头像
  • fbzok
  • (fbz)
  • 等 级:
#59楼 得分:0回复于:2009-07-01 15:39:53
不管别人的书写的如何,这种奉献精神就非常值得赞赏。

奉劝攻击的人,自己有本身写点像样的东西来先吧。我突然想到一个题外话,这几天一个事情,有个什么学者攻击今年一个高考考生的满分作文,攻击评卷老师。
http://blog.sina.com.cn/s/blog_3e47063f0100dj7o.html?tj=1,我回复的“有本事自己写点东西让别人瞧瞧,攻击别人算什么”,当然这话不是针对这个帖子里面的兄弟。毕竟搞开发的跟那些文人相轻还是不同的,更多倾向于“只敬佩自己认为厉害的人”,这一点在那些垃圾文人身上是没有的
#60楼 得分:0回复于:2009-07-01 15:40:27
看看
  • yyyapple用户头像
  • yyyapple
  • (会用牙刷的鱼)
  • 等 级:
#61楼 得分:0回复于:2009-07-01 15:44:20
顶一下
  • asksgp用户头像
  • asksgp
  • (笨鸟先飞)
  • 等 级:
#62楼 得分:0回复于:2009-07-01 15:50:57
来看看
  • yyyapple用户头像
  • yyyapple
  • (会用牙刷的鱼)
  • 等 级:
#63楼 得分:0回复于:2009-07-01 15:53:05
文件好像损坏了,打不开
#64楼 得分:0回复于:2009-07-01 16:31:16
下载了,拜读
#65楼 得分:0回复于:2009-07-01 16:47:41
顶顶
#66楼 得分:0回复于:2009-07-01 16:54:27
谢谢楼主
#67楼 得分:0回复于:2009-07-01 16:54:34
顶顶
#68楼 得分:0回复于:2009-07-01 17:08:06
楼主想表达什么?帮忙评价一下书怎么样?
  • ymingw用户头像
  • ymingw
  • (学习技术,不问实事)
  • 等 级:
#69楼 得分:0回复于:2009-07-01 17:33:20
.........
#70楼 得分:0回复于:2009-07-01 18:37:48
既然是 深度剖析  没有深入到汇编  差了一大截吧
#71楼 得分:0回复于:2009-07-01 20:08:13
引用 57 楼 fbzok 的回复:
引用 51 楼 maolisheng1985 的回复:
我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include <iostream>
using namespace std;
int main()
{

char P[] = "I love china";
char *pp = P;
cout < <pp;
char (*ppp)[13] = &P;
cout < <*ppp;
return 0; }


在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个…


麻烦你把问题看清楚再回答,谢谢
#72楼 得分:0回复于:2009-07-01 21:16:04
引用 71 楼 maolisheng1985 的回复:
引用 57 楼 fbzok 的回复:
引用 51 楼 maolisheng1985 的回复:
我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include  <iostream>
using namespace std;
int main()
{

char P[] = "I love china";
char *pp = P;
cout  <  <pp;
char (*ppp)[13] = &P;
cout  <  <*ppp;
return 0; }


在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一…

又是数组,kao!
我来解释一下,不知对不对:
1)数组名可以作为指针使用;
2)数组也是一种数据类型;
3)ppp是char [13]类型的指针,故需要使用数组地址赋值;
4)*ppp取得数组地址所在的值,访问到了数组名指向的字符串。
#73楼 得分:0回复于:2009-07-01 21:35:53
引用 70 楼 kondykuang 的回复:
既然是 深度剖析  没有深入到汇编  差了一大截吧
不懂瞎嚷嚷……
#74楼 得分:0回复于:2009-07-01 22:23:59
顶顶更健康。
  • cunsh用户头像
  • cunsh
  • (村少)
  • 等 级:
#75楼 得分:0回复于:2009-07-01 23:27:22
mark
  • lin_style用户头像
  • lin_style
  • (JAVA卧底、二分流掌门人)
  • 等 级:
#76楼 得分:0回复于:2009-07-01 23:48:31
引用 51 楼 maolisheng1985 的回复:
我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include <iostream>usingnamespacestd;intmain()
{charP[]="I love china";char*pp=P;
cout < <pp;char(*ppp)[13]=&P;
cout < <*ppp;return0; }
在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个却需取指针里的内容?


所以C会考死人的。。第一个指一个指针值,第二个是定义一个数组指针,你总得给他一个匹配的空间的指定吧。
至于字符数组为什么直接用就是指针,取地址表类型,那就归C的自己规定了。简化来说就是这样,

#77楼 得分:0回复于:2009-07-02 00:58:31
学习
  • fbzok用户头像
  • fbzok
  • (fbz)
  • 等 级:
#78楼 得分:0回复于:2009-07-02 01:03:26
哎,maolisheng1985,你真是故弄玄虚
  • jn989用户头像
  • jn989
  • (ning)
  • 等 级:
#79楼 得分:0回复于:2009-07-02 01:48:44
lz自己写书?太强了,赞!
感谢分享
ps:感觉书名起得有点高调了,评价还是等看完后读者给出较好吧
#80楼 得分:0回复于:2009-07-02 09:01:07
下了.
看看!
#81楼 得分:0回复于:2009-07-02 10:55:58
引用 78 楼 fbzok 的回复:
哎,maolisheng1985,你真是故弄玄虚

我没有啊,我只是在学习中遇到的问题
#82楼 得分:0回复于:2009-07-02 10:56:51
引用 76 楼 lin_style 的回复:
引用 51 楼 maolisheng1985 的回复:

我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include <iostream>usingnamespacestd;intmain()
{charP[]="I love china";char*pp=P;
cout < <pp;char(*ppp)[13]=&P;
cout < <*ppp;return0; }
在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个却需取指针里的内容?


所以C会考死人的。…

不知道在C标准可否查到此问题
  • nouce用户头像
  • nouce
  • (nouce)
  • 等 级:
#83楼 得分:0回复于:2009-07-02 11:02:54
看看!
  • lin_style用户头像
  • lin_style
  • (JAVA卧底、二分流掌门人)
  • 等 级:
#84楼 得分:0回复于:2009-07-02 12:16:46
引用 82 楼 maolisheng1985 的回复:
引用 76 楼 lin_style 的回复:
引用 51 楼 maolisheng1985 的回复:

我倒想看看楼主有多NB,楼主请回答下我的问题:C/C++ code# include  <iostream>usingnamespacestd;intmain()
{charP[]="I love china";char*pp=P;
cout  <  <pp;char(*ppp)[13]=&P;
cout  <  <*ppp;return0; }
在VC++6.0编译中为什么第一个指针直接可以赋数组名,而第二个指针则必须需要加取地址的符号?cout的格式也一样,一个只需指针,另外一个却需…


http://topic.csdn.net/u/20090701/19/541c38b9-a7bb-4a56-98ac-d1457f0c0a86.html?seed=1424873664

来看看这边的讨论吧。
如果只是在语法和语义上耗费。。我想还是自己估量下吧。。
#85楼 得分:0回复于:2009-07-02 12:23:26
看看。。。。
#86楼 得分:0回复于:2009-07-02 16:14:40
首先非常赞赏楼主的精神,已经看了部分,每一部分都学习到了很多,里面的东西都很基础,不是很深入哦。
当然明白了里面的东西,对实际应用中很有帮助。是不是不明白一些基础的东西就不能进行实际的编程工作了呢?
我看未必,就像现在我还是不知道1+1为什么就等于2 ,但还是会运算一些微积分的数学。
非常感谢楼主给上了精彩的c语言基础课程。不过书名有些托大了。且书中某些观点还可以再商榷下。
如p40页说到空结构体占一个字节大小的原因的一段推理。我想请问楼主是从哪一篇文献或者资料上得到这一段,
感觉好像是楼主自己的理解哦。如果不是从文献上摘录的,建议楼主看看侯捷译的《深度探索c++对象模型》里面有过一段评述。


#87楼 得分:0回复于:2009-07-02 16:30:02
#88楼 得分:0回复于:2009-07-02 17:33:58
帮顶
#89楼 得分:0回复于:2009-07-02 22:30:44
下了,好像还不错,顶了.....顺带膜拜下LZ
#90楼 得分:0回复于:2009-07-03 09:42:10
下了,看完再说
#91楼 得分:0回复于:2009-07-03 10:00:45
第58页有一处错误。

#include "stdio.h"
void main()
{
   
    int i;
    for(i=0, printf("First=%d\n", i);
        i <3; printf("Second=%d\n", i);//此处printf语句变为判断语句,加上后会形成死循环;
        i++, printf("Third=%d\n", i));
     
    {printf("Fourth=%d", i);}
}
#92楼 得分:0回复于:2009-07-03 10:15:39
好东西啊。楼主是个好人
  • lzldnc用户头像
  • lzldnc
  • (lzldnc)
  • 等 级:
#93楼 得分:0回复于:2009-07-03 10:21:30
我是c语言的初学者,下来拜读一下
  • majun01用户头像
  • majun01
  • (每天前进一小步。)
  • 等 级:
#94楼 得分:0回复于:2009-07-03 10:21:35
关注...
#95楼 得分:0回复于:2009-07-03 10:28:36
汗一下这个比喻
皇帝身边的小太监 ---- 寄存器 11
#96楼 得分:0回复于:2009-07-03 10:34:26
顶,严重支持
#97楼 得分:0回复于:2009-07-03 10:34:28
正准备下载
  • hqin6用户头像
  • hqin6
  • (!独行)
  • 等 级:
#98楼 得分:0回复于:2009-07-03 10:44:31
哈哈~~枪打出头鸟!
  • linren用户头像
  • linren
  • (飞船 5岁了)
  • 等 级:
#99楼 得分:0回复于:2009-07-03 11:06:14
不多谢楼主分享,很多内容都很新鲜

推荐一个打印类型的类(VC下使用):
C/C++ code
#include <stdio.h> #include <typeinfo.h> int main(){ char a[100]; printf("%s\n",typeid(&a).name()); return 0; }

结果是:
char (*)[100]
Press any key to continue
#100楼 得分:0回复于:2009-07-03 12:06:39
c都学过去两年了,发现自己还是什么都不懂,悲哀啊。。。
相关问题
本人新书出炉,欢迎大家下载:C语言深度解剖(解开程序员面试笔试的秘密 ...