免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

对C语言指针的讨论:应当如何理解、使用指针?《狂人C:程序员入门必备》有奖试读 [复制链接]

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
121 [报告]
发表于 2010-12-16 00:51 |只看该作者
书中的名词建议前后一致,前面讲了共用体,后面出现了联合体(9.1.2)。对于学过C的,感觉问题不大,如果是初学者,会晕的:出现了新的数据类型--联合体。个人觉得一本书的名词最好前后一致会比较妥当。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
122 [报告]
发表于 2010-12-16 01:05 |只看该作者
函数的参数传递没讲透?还是在后面?很多初学者疑惑为啥scanf需要&d,而不是直接d,就是因为不知道函数的参数传递

论坛徽章:
0
123 [报告]
发表于 2010-12-16 09:50 |只看该作者
本帖最后由 klose911 于 2010-12-16 10:04 编辑

计算机科学用一个词概括就是'抽象'。

C是对汇编的抽象, 通过指针获得想要的变量值本质上就是汇编中寄存器的相对寻址方式的一种抽象。
指针的值实质上就是内存中某个单元的编号,这就是地址,但是得到这个地址以后,怎么用依赖于这个指针变量的声明类型。

打个不恰当的比方,
大楼里面每户人家在底楼都有自己的信箱,信箱好比就是指针,信箱上面的编号就是地址
我订了一份报纸,每天早上我去拿, 我得先知道自己信箱的编号,找到自己的信箱,然后再拿,这就好比是通过指针获得想要的变量值。
当然每次打开信箱,我还可能拿到的是信,明信片,包裹,广告, 这就是void类型的指针,不能事先确定你要拿到的东西的类型。
假如寄给你挂号信,你不在家,邮递员会给你留个条子,让你去附近的邮局去取, 你拿到的这个条子其实也是起的指针的作用,这就是指向指针的指针。
假如你取到的是一份菜谱, 你照着他上面的说明,开始学做菜,这就好比是函数指针。

论坛徽章:
0
124 [报告]
发表于 2010-12-16 10:54 |只看该作者
   但你是专家啊,而且是资深专家。(这是肯定的,介绍里写的,哈哈)
受教了。你的意思是算法可以大胆创新,语法还是要循规蹈矩点好,对吧?
其实我说考虑实际编程需求,更多的意思是我们应该从需求上反过来理解一门语言对数据结构及函数等所做的倾向性的设计。
就像PHP,很多语法借鉴了Perl,但同时又加强了它在网络编程方面的需求,所以心里面明确这一点的话,在学习它的时候就很自然的想到发明它的人为何会这样设计而非那样。x9x9 发表于 2010-12-15 23:36

快别这么说。所谓“资深专家”是无风之谷为了让讨论能进行的更好,好心给我加的一顶大帽子。
我自己觉得自己充其量也就一C语言爱好者。
但顾及到无风之谷的美意难拂,我也只能带着不尽的忐忑就那么半推半就了,当不得真的。
您说的“从需求上反过来理解一门语言对数据结构及函数等所做的倾向性的设计”这层意思,很惭愧,我现在才体悟到
您说的是对的
记得starwing83网友有过一个名帖就是讨论语言设计的
这方面我觉得我还需要向你们学习
欢迎多发表这方面的观点和看法

论坛徽章:
0
125 [报告]
发表于 2010-12-16 11:14 |只看该作者
其实goto用处还是很大的,OS底层的代码经常看见goto,如果非要规矩判断的话,效率会下降很多。举个简单例子 ...
mirnshi 发表于 2010-12-16 00:41



    这个我也不否认
    但是goto被某些书介绍的和使用的太轻率了
    我有点想矫枉过正的意思

论坛徽章:
0
126 [报告]
发表于 2010-12-16 11:17 |只看该作者
书中的名词建议前后一致,前面讲了共用体,后面出现了联合体(9.1.2)。对于学过C的,感觉问题不大,如果是 ...
mirnshi 发表于 2010-12-16 00:51



谢谢指正!
名词不一致很不好
如果重印我一定争取改过来

(也许搞个Index更好?)

论坛徽章:
0
127 [报告]
发表于 2010-12-16 11:18 |只看该作者
函数的参数传递没讲透?还是在后面?很多初学者疑惑为啥scanf需要&d,而不是直接d,就是因为不知道函数的参 ...
mirnshi 发表于 2010-12-16 01:05



    您指的是哪章?
    (深夜还在写贴,辛苦了。鞠躬致谢!)

论坛徽章:
0
128 [报告]
发表于 2010-12-16 11:32 |只看该作者
建议在发书的时候在后面附上你的个人网页,如果有勘误或错误都可以到上面去查证

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
129 [报告]
发表于 2010-12-16 11:37 |只看该作者
本帖最后由 gvim 于 2010-12-16 11:40 编辑

回复 124# KBTiller

没必要惭愧。语言设计者都只是针对问题域设计的,谁都想不到未来太多事情。
我认为C就是汇编的直接翻译,他的问题域就是比汇编更高级的语法和程序组织方式。寻址方式对应指针,call对应函数,mov等东西对应赋值,+-*/都有对应的汇编指令。
我认为旧式C++是面向对象建模方式的翻译,他的问题域就是提供语言级的面向对象机制,提供封装,多态,继承。
说到这个,甚至新式C++在引入模版的时候,语言设计者都不知道还可以做元编程,还是通过一个偶然错误才发现的这个性质。
java主要解决的是C++没解决好的垃圾回收问题和C++的复杂性,所以在面向对象方面我们可以看到和C++十分类似的语法,但是比C++需要处理的东西更少。
perl的领域是正则
python的领域是动态和胶合
以上所说的不同语言仅是面向不同的问题域。语言设计上,没有所谓的需求因为语言是通用的解决模式。只面向问题域。换句话说,C可以解决以上语言突出的所有领域,只是其他语言以不同形式更方便的提供出来,比如原生数据结构如string,自动类型识别,也可能是平台库等等。
所以选择语言不是以需求作为选择,而是以问题域作为选择。所有通用语言都可以解决需求问题,只是适合问题域的语言做出来更简洁方便罢了。那么,思考语言也不是以需求为背景。

另一方面,lisp,ML,prolog等语言提供的又是另一种运算模型和他们适合的问题域。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
130 [报告]
发表于 2010-12-16 16:29 |只看该作者
这本狂人C是谁写的啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP