免费注册 查看新帖 |

Chinaunix

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

[C] 浅谈一下C语言中的指针与数组的关系 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
51 [报告]
发表于 2012-12-24 08:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
52 [报告]
发表于 2012-12-24 08:17 |只看该作者
本帖最后由 Ager 于 2012-12-24 08:17 编辑
pmerofc 发表于 2012-12-23 21:41
ager这次写得确实哲学味道浓了些。

gvim 发表于 2012-12-23 21:58
另外,窃以为简单的东西没必要复杂化,工程的东西没必要哲学化,越往复杂了说,越让人不解


呵呵,我来澄清一下吧。。。

在我看来,典型的“哲学/形而上学化”的阐释,一般是这种样子的:

xx是现象,yy是本质,我们要透过现象看本质。。

xx只是一个工具,yy才是本质。。。。。

xx只是理论,yy才是实践。。。。。。。

实践是检验真理的唯一标准。。。。。。。。。

数组是现象,指针是本质。。。

指针是现象,地址是本质。。。。。

数组的本质是。。。。。。

指针的本质是。。。。。。。。

深入贯彻落实xx语言编程思想,要求我们认真学习、深入了解,深刻领会、准确把握,坚决贯彻、切实落实。。。。。

。。首先,要认真学习、深入了解“指针”。学习贯彻xx语言编程思想,要准确把握“指针”,这是学习和贯彻的前提。。。。“指针”是xx语言的灵魂。。。。

。。。其次,要深刻领会准确把握xx语言编程思想。一是深刻领会xx语言的历史地位和科学内涵,二是深刻领会xx语言的鲜明特色和基本要求,三是深刻领会xx语言的宏伟目标,四是深刻领会xx语言的总布局,五是深刻领会“指针”是xx语言的核心。只有深刻领会才能准确把握xx语言编程思想,才能更好的贯彻落实xx语言编程思想。

。。。。最后,要坚决贯彻、切实落实xx语言编程思想。要大力发扬“理论联系实际”的开发风格,只有学以致用,坚持用xx语言编程思想指导实践,同时在实践中不断加深对xx语言编程思想的理解,才能真正把xx语言编程思想落到实处。

。。。。。xx语言编程思想确定了软件开发者对未来工作的指导思想,是软件开发者未来工作的方向塔,更是我们基层程序员的指明灯。我们要学认真习、深刻领会,在工作中切实贯彻落实,为IT事业发展事业而努力奋斗。


—— 喏,上面这种,就是“哲学”阐释的一种极致形式。

这种形式的特点是:对读者认知关于“xx语言编程思想”、“指针”的具体而直观的信息,没有任何帮助。

更有意思的是,你若把上文中的“xx语言编程思想”和“指针”替换成任何你想要强调的东西,其结果,都是“正确”的。

然而,我希望我所走的这条路,不是所谓“哲学之路”。

在我这里,更加关心的是:

(1)一个对于学习者本来是陌生的概念,是如何进入他们的视野中的,是以何种“样式”、“质感”甚至“成见”、“偏见”进入他们的意识中的 —— 比如说,许多用来对译的汉字(如“操作”)具有陷阱效应。

(2)学习者的畏难情绪,很可能来自于某种“魅”(宏大叙事的干扰,比如学习者总是习惯了闻听“指针是C的灵魂”从而产生某种自己也说不清的虚假敬畏)或某种“遮蔽”(由于学习者缺乏编程经验和学科素养,一些被业界内部非常熟稔、司空见惯、不言自明的知识、概念、思路和方法,这些关键信息在学习者那里却是阙失的;学习者被壁垒在话境之外,导致“看也看不懂、想也想不明白”)—— 比如说,有一些术语(如“打印/Print”、“回车/Carriage Return”)被遮蔽了历史源流。所以,优良的教材,应该为学习者“祛魅”、“祛蔽”。

(3)一个正确的编程语言要素(概念)的其正确性,应该在编程者对程序的具体编写过程(包括Thinking、Coding、Commenting和Reviewing)中体现出来,也就是说,概念之本身和对它们的使用,是彼此照映、彼此揭示的。

(4)编程语言的创造者、语言规范的制定者、算法与数据结构的发明者、设计模式的倡导者,他们原本的意图(或忌惮)是什么?他们希望自己的观念,怎么样地(分步骤、分层级地)呈现或被呈现在学习者的面前?

我希望,自己所做的,是“现象学(Phenomenology)”的 —— 其实它是反哲学的。

我的基本主张是这样的:

(1)除了现象,没有本质。

(2)应该尽力回到当事现场,发掘“质感性”、“偏见性”的东西 —— 这些东西通常被忽略或被刻意隐藏起来了。

(3)有一些东西应当被“悬搁”、“加上括号”。

就扯这麽多了,期盼大虾们指正,呵呵 —— :)


论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
53 [报告]
发表于 2012-12-24 08:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
54 [报告]
发表于 2012-12-24 08:34 |只看该作者
看到过一个版本的解释,感觉更简单一些……

星号没有特殊含义,比如 int *p; 指右侧的表达式 *p 的类型为左侧的 int,所以依照星号解除指针引用的原意,p 为指针。

数组同理,比如 int x[10]; 指右侧表达式 x[10] 的类型为左侧的 int,所以依照方括号取下标的原意,x 为数组,元素个数为声明时的下标 10。

推广到函数,比如 int foo(int bar); 指右侧 foo(int bar) (即一次函数调用返回值)的类型为左侧的 int,所以这里的圆括号也维持原意。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
55 [报告]
发表于 2012-12-24 08:53 |只看该作者
本帖最后由 Ager 于 2012-12-24 08:55 编辑

谢谢支持哦 {:3_193:}

timothyqiu 发表于 2012-12-24 08:34
星号没有特殊含义,比如 int *p; 指右侧的表达式 *p 的类型为左侧的 int,所以依照星号解除指针引用的原意,p 为指针。


这种理解法,的确容易帮助初学者尽快“过关”。但是,遇到这样附有初始化的声明行,就容易引发困惑:
  1. int x;
  2. int *p = &x;
复制代码
timothyqiu 发表于 2012-12-24 08:34
数组同理,比如 int x[10]; 指右侧表达式 x[10] 的类型为左侧的 int,所以依照方括号取下标的原意,x 为数组,元素个数为声明时的下标 10。


类似的道理,对于这样附有初始化的声明行:
  1. int *(*x)[3]= &a;
复制代码
一个可以令x合法的a,到底该是什么样子(啥类型)的?

在程序中,x该怎么用?

呵呵 ……

论坛徽章:
0
56 [报告]
发表于 2012-12-24 09:00 |只看该作者
回复 55# Ager

声明和初始化虽然写在一起,但却是不相干的两步,是可以剥离看的。所以初始化并不包含在右部里。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
57 [报告]
发表于 2012-12-24 09:05 |只看该作者
timothyqiu 发表于 2012-12-24 09:00
回复 55# Ager

声明和初始化虽然写在一起,但却是不相干的两步,是可以剥离看的。所以初始化并不包含在 ...


你说得没错:)

但是,按照那种理解法,初学者的困惑在于:

那个“int *p=&a;” 到底是在对“p”初始化,还是对“*p”初始化?

呵呵  {:3_193:}

论坛徽章:
0
58 [报告]
发表于 2012-12-24 09:14 |只看该作者
回复 57# Ager


呃……被你这么一说我自己都困惑了一会儿,囧……

想了下,分析 int *p = &a 时,如果第一步就已经将其划分为声明(int *p)和初始化(p = &a)两部分,应该就不会再有这样的困惑了吧(虽然话说回来,如果是初学的话什么错都可能犯……)

论坛徽章:
0
59 [报告]
发表于 2012-12-24 09:43 |只看该作者
终于找到出处了……K&R 第二版第五章里有写:
The declaration of the pointer ip,
    int *ip
is intended as a mnemonic; it says that the expression *ip is an int. The syntax of the declaration for a variable mimics the syntax of expressions in which the variable might appear.

(指针 ip 的声明 int *ip 的本意是助记符;其含义为表达式 *ip 是一个 int。变量声明的语法模仿了该使用变量的表达式的语法。)

论坛徽章:
0
60 [报告]
发表于 2012-12-24 10:02 |只看该作者
真的没必要拿初学者来当借口
就像楼上说的,初学者什么错误都可能犯的
就像楼主写那么一大段,老手看了都要绕半天,何况初学者?
给初学者讲,一方面要通俗易懂,另一方面要抓住本质。
关注太多中间的产物,真的有点像玩八股文的感觉
当然也有很多人以玩八股文为乐趣,我也是要尊重的,但没必要初学者来忽悠
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP