免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
21 [报告]
发表于 2012-12-22 21:56 |只看该作者
sqfasd 发表于 2012-12-22 21:22
    int a[5];
你看到它的声明,就知道该怎么使用它, 用跟声明一样的形式就是a[1]表示一个int
读这个声明的时候,就这样去思考,a通过每一个下标运算符计算(或者叫做偏移)的数据类型是int型的,实际上a是内存上一段连续的数据块,这个数据块的粒度就是int,这个数据块的界限是5,界线以外的都是不可控的。


呵呵,谢谢你的支持哦:)

不过,在我写这篇帖子的目的当中,有一个很重要的,就是建议大家不要使用那种理解方法(上面的赤字部分){:3_193:}

论坛徽章:
0
22 [报告]
发表于 2012-12-22 22:03 |只看该作者
本帖最后由 sephirosh- 于 2012-12-22 22:06 编辑
Ager 发表于 2012-12-22 21:43
呵呵,没事儿


我看了文章了,我还是一头雾水,你讲的是编译器的处理规则还是?

其实,所谓的变量,所谓的标识符,或者说,某种计算机语言,都只是编译器,解析为机器码的的一个标准而已,而里面的种种手法,包括数组和指针,本质还是变成机器码,至于例如整形等数据类型,只不顾是声明告诉编译器,长度的一种方式,最终还是存内存里面的一组二进制,而例如float之类的,double之类的,除了长度之外,还有就是声明一种储存方式的标准(例如
IEEE745)
语言里面的种种形式的定义,都是为了使编译器解析起来更加轻松,
编译器承担着解析和优化的任务,最终编译成某种格式例如PE等等可执行格式的文件存放起来。 我做的静态反编译,比较多,所以说话有时候有点让人难以接受。比较简短和本质。当然我上面说的也是比较片面的,但是作为交流和表达意思我想是足够了。。。很久没有逛过论坛了。。也比较少和人交流,所以抱歉。


哦对了,补充一点,包括C语言,都是一种标准规则而已,所谓的跨平台,是因为编译器会根据那种平台去生成相应的机器码,之后用某种格式标准去保存,使其可以达到相应的执行效果。例如PE格式

论坛徽章:
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
23 [报告]
发表于 2012-12-22 22:07 |只看该作者
本帖最后由 Ager 于 2012-12-22 22:20 编辑
sephirosh- 发表于 2012-12-22 22:03
你讲的是编译器的处理规则还是?


还真不是。

我主要还是想帮助编程者理解这门语言本身,或者说,理解C语言的用法。

呵呵。。。。

{:3_193:}


P.S.: 这就好比,我们如何理解English的用法。比如:

为什么可以说“Look at me!”;而不能说“Look me!”?

为什么可以说“Listen to her!”;而不能说“Listen her!”?

为什么可以说“Where were you?”;而不能说“Where did you?”,却又可以说“Where did you come from?”;而又不能说“Where were you come from?”,却又可以说“Where were you coming from?”?

其实,我对这一类问题,玩起来非常起劲儿,呵呵。。。。@_HellAngel_ 知道的 {:3_202:}

论坛徽章:
0
24 [报告]
发表于 2012-12-22 22:09 |只看该作者
回复 22# sephirosh-
我跟这位理解的方式是类似的,从最终使用的角度去理解,也就是理解它是what
楼主应该是从编译器的角度去解释,解释的是how
不知道我总结的对不对


   

论坛徽章:
0
25 [报告]
发表于 2012-12-22 22:18 |只看该作者
sqfasd 发表于 2012-12-22 22:09
回复 22# sephirosh-
我跟这位理解的方式是类似的,从最终使用的角度去理解,也就是理解它是what
楼主应 ...


其实楼主说有点深奥,对于初学者,会有一头雾水的感觉。如果要阐述编译器的行为,我觉得,太简单了,其实我也看得有点不明白在说什么,因为一直我都把所有语言看做一种工具,我要实现的东西,用什么语言方便我就会用什么语言,例如现在我很少用c去写东西,爱上WEB,例如用php,我可以很轻易的实现各种复杂的操作来处理我目前需要做的事务。例如,我破译一个XX导出来的固件,把他变成文件系统,用php一下子搞定,不对,修改一下,刷新一下WEB界面,OK,不需要编译之类的工作。

但是从编译器角度来说,我曾经也写过类似于编译器的东西,其实,都是一些规则的交叉组合应用而已。最终解析为最基本的机器码,而机器码是运行在什么CPU上面的,是什么系统的,需要什么格式这些就足够了。再深入点讲,格式也是一种定义好的规则,只是这种规则被大范围引用,例如微软的PE linux 的ELF

论坛徽章:
0
26 [报告]
发表于 2012-12-22 22:25 |只看该作者
本帖最后由 sqfasd 于 2012-12-22 22:25 编辑

回复 25# sephirosh-

我觉得通过汇编去学习C语言,比通过c标准手册去学习,要有效率的多,楼主恰恰是后者
反正我是通过前者去学的,后者是给编译器开发人员看的,其他程序员当然也可以看,但付出的精力跟学习到的东西远远不成比例
c就是对内存管理的低层次抽象,记得前人这样教过我,我也很受用
   

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
27 [报告]
发表于 2012-12-22 22:31 |只看该作者
本帖最后由 _HellAngel_ 于 2012-12-22 22:31 编辑

回复 23# Ager

HOHO~!~~!。。是啊。。上次半夜讨论这个讨论得还异常高兴。。。

   

论坛徽章:
0
28 [报告]
发表于 2012-12-22 22:32 |只看该作者
回复 26# sqfasd
当然,底层去看高层,是不同的,底层更灵活,但是难以理解难以编写,所以才会有高层的出现,高层是是用某种规则封装了一种底层的东西,最终编译器见到例如x=a+b这组规则之后,就解析成底层的方式,最终达到可读性和可规范性,可项目性的效果,但是,如果是一个资深人士,个人认为有些重要的东西用底层编写,肯定更加有执行效率,因为编译器的规则是死的,人是活的,我的学习路线是高层,再到更高层,再去理解底层,再去理解更底层,这种线路。因为越高层约好理解,最终做多了就会去问Why?
其实,我学习的东西不多,包括破解破译,包括内核,都是自己悟出来的,没有学习过,。但是他们逃离不出这些规则

论坛徽章:
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
29 [报告]
发表于 2012-12-22 22:47 |只看该作者
本帖最后由 Ager 于 2012-12-22 22:56 编辑
sqfasd 发表于 2012-12-22 22:25
回复 25# sephirosh-

我觉得通过汇编去学习C语言,比通过c标准手册去学习,要有效率的多,楼主恰恰是后者
反正我是通过前者去学的,后者是给编译器开发人员看的,其他程序员当然也可以看,但付出的精力跟学习到的东西远远不成比例
c就是对内存管理的低层次抽象,记得前人这样教过我,我也很受用


关于这个问题,pm大虾的《品悟C》一书有谈到,各位不妨参考一下。。。

此外,我想再讲一些。。。

C语言,具有其他语言难以企及的内在形式美,这是它之所以小巧玲珑却功能强大、认知曲线在某一处的陡峭程度(概念的堆叠程度)与在此处发挥出的效率程度成正相关的根本原因。

C语言本身的策略(哪怕那些可以视为跟编译器无关的部分),为那些特别奥妙的设计模式,铺张出了足够辽阔的舞台。

在某个角度看来,理解C语言本身所获得的乐趣,比单纯地利用它来hack something所获得乐趣,要多许多。。。





论坛徽章:
0
30 [报告]
发表于 2012-12-22 22:52 |只看该作者
Ager 发表于 2012-12-22 22:47
关于这个问题,pm大虾的《品悟C》一书有谈到,各位不妨参考一下。。。

此外,我想再讲一些。。。


楼主说的有道理,其实感悟只要有一个切入点,大道三千,最终回归本质,而过程才是最快乐的。回顾起来,一种好的乐观的心态去面对问题,是好事,最终都能感悟自己的道。这个就是成长的过程。结果都是差不多的。
就好像


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP