免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
0
12 [报告]
发表于 2012-12-22 20:35 |只看该作者
数据与指针的关系,其实说不上什么关系,只是指针可以访问数组,指针与其说是一种类型,还不如理解成一种工具,这种工作的作用就记录地址,访问地址,修改地址里面的值。仅此。
而数组是一种数据的记录方式,是最简单的数据结构。

而我们通常看到的数组和指针,只不过是这种工具(指针)的一个应用

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

论坛徽章:
0
14 [报告]
发表于 2012-12-22 21:22 |只看该作者
深深佩服楼主的研究精神和用词的专业性。
但我觉得从编译器的角度去解释这些事情太吃力不讨好了,太晦涩了,事实上对非编译器开发者的程序员来说也是没有多大意义的。
对于数组的声明,我的理解可能没那么专业,但很实用。
有些语言的数组声明比c语言的更直观一些,比如java中可以这样声明一个数组
  1. int [] a;
复制代码
按照自然的方式从左往右读,int是基本类型,[]是扩展类型,a是标识符
go语言声明一个数组正好跟java是反着的,但也是很直观的
  1. var x int = 1;//声明并定义一个int型变量
  2. var x [5]int; //go语言声明一个int型数组
复制代码
从左往右读,就是: 一个变量var,它的名字叫x,它的类型是,长度是5的数组扩展类型[],再加上一个int类型,也就是一个扩展类型。

反观c语言,基本类型和扩展类型没有放在一起,而是被中间一个标识符隔开了,为什么c语言这么反直觉的
我记得跟网友交流的时候,谈到一个c语言的设计哲学,那就是让声明的形式和使用的形式一致。比如
  1. int a[5];
复制代码
你看到它的声明,就知道该怎么使用它, 用跟声明一样的形式就是a[1]表示一个int
读这个声明的时候,就这样去思考,a通过每一个下标运算符计算(或者叫做偏移)的数据类型是int型的,实际上a是内存上一段连续的数据块,这个数据块的粒度就是int,这个数据块的界限是5,界线以外的都是不可控的。
理解了内存模型,也就理解了c语言最难懂的指针。而不用去费尽心机去研究编译器是怎么解释它的。

再谈谈指针跟数组的关系,在大多数情况下,指针跟数组是没有任何联系,他们有时候使用方式类似,那是他们面对的内存模型是一致的
唯一把数组跟指针关联在一块的是,当函数的参数为一个数组或指针,而你传的实参是一个数组首地址的时候,编译器就会把这个首地址拷贝一份,放到一个指针变量里,也就是形参里的那个副本
有的书里面说,这是数组到指针的退化
为什么要这么做,楼主也说的很清楚了,编译器完全可以把整个数组的数据拷贝到栈里,作为形参副本
但是为了效率上的原因,编译器只好跟程序员“约定”,数组就在那个地方,它的地址存放在这个指针里,你通过这个指针去操作吧
就这样只是一个约定
到底什么是指针,去稍微学点汇编,了解下cpu的内存管理,就彻底搞懂了。

论坛徽章:
0
15 [报告]
发表于 2012-12-22 21:29 |只看该作者
本帖最后由 sephirosh- 于 2012-12-22 21:30 编辑
pmerofc 发表于 2012-12-22 20:51
错得没边
肤浅

个人有个人的理解方式,谢谢,是否肤浅无所谓,至于错误,就看你怎么理解了。

论坛徽章:
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
16 [报告]
发表于 2012-12-22 21:38 |只看该作者
sephirosh- 发表于 2012-12-22 20:35
数据与指针的关系,其实说不上什么关系,只是指针可以访问数组,指针与其说是一种类型,还不如理解成一种工具,这种工作的作用就记录地址,访问地址,修改地址里面的值。仅此。
而数组是一种数据的记录方式,是最简单的数据结构。

而我们通常看到的数组和指针,只不过是这种工具(指针)的一个应用


呵呵,谢谢你的支持:)

不过,在我看来,与其说你错了,不如说你所说的等于没说。。。。。。

{:3_194:}

论坛徽章:
0
17 [报告]
发表于 2012-12-22 21:40 |只看该作者
我说的也不是太好,还望前辈们多多指点

论坛徽章:
0
18 [报告]
发表于 2012-12-22 21:42 |只看该作者
Ager 发表于 2012-12-22 21:38
呵呵,谢谢你的支持:)

不过,在我看来,与其说你错了,不如说你所说的等于没说。。。。。。


哈哈,我只看,你的标题,没看文章。。。你的标题是指针的数组的关系。。。
我待会看看正文。。在做交流,谢谢

论坛徽章:
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
19 [报告]
发表于 2012-12-22 21:43 |只看该作者
sephirosh- 发表于 2012-12-22 21:42
哈哈,我只看,你的标题,没看文章。。。你的标题是指针的数组的关系。。。
我待会看看正文。。在做交流,谢谢


呵呵,没事儿 {:3_193:}

论坛徽章:
1
白羊座
日期:2014-03-22 18:23:03
20 [报告]
发表于 2012-12-22 21:45 |只看该作者
回复 18# sephirosh-

萨菲罗斯都来了= =。。。那克劳德在哪= =。。。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP