免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 64138 | 回复: 178
打印 上一主题 下一主题

严重声明:C语言中不存在数组的类型!它仅仅是一个概念! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-19 20:14 |只看该作者 |倒序浏览
在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。

但是在C中,可以说,不存在这种高级语言的数组类型,,C中的数组,仅仅是地址排列在一起的元素而已,不管是char、int还是复杂的struct数组,,仅仅是排列在一起的该类型大小的内存而已。数组的下标引用,仅仅是指针偏移的一种易读的形式!也可以说,数组在C中只是一个名字,简称而已。

如果你定义了一堆类型相同的变量,比如int a, b, c, d, e, f, .....只要它们编译后的内存地址是连续的,那么你也可以用数组的方式使用它们:

int *p = &a;
p[0] = 1; //a
p[1] = 2; //b
p[3] = 3; //c
......

我觉得,在考虑C语言的任何问题的时候,都必须在大脑中画出一个内存空间来,,你所有的变量、函数什么的,都排列在这些空间上,然后,一切就都容易理解了。。。。

所以说,那个关于数组名能不能减1的帖子,根本没有必要讨论那么多页,,数组名仅仅是一个指针而已,它的类型为数组的元素类型的指针,,只是通常这个指针指向第一个元素,而且为常量而已!

对编译器来说,任何类型的指针,仅仅是指向的内存大小不同,其它都按照相同的对待! 所以数组名减一,就好比一个指针减一效果一样。

大家别忘了,,C语言之前还是汇编和机器语言,,丹尼斯瑞奇它们不可能从汇编时代一下子就设计到21世纪计算机发展水瓶,所以C的很多设计,其实就是汇编语言的设计
在汇编中也存在一种字符串拷贝命令MOVSB,把首地址放入一个寄存器(好像是SI),然后把数量放入另一个寄存器(好像是CX),随后是目的地址寄存器(好像是DI),
可以看出,汇编语言中的字符串拷贝命令和C中的数组命令是类似的,就是要求地址连续!

从汇编、机器、硬件的角度思考C语言的问题,才是正确地道路。。而且几十年来,到了今天,计算机仍然是几十年前的体系结构,就算出来更多的java/net,  C的这种工作方式仍然是有效的,,这是当代计算机软件的基础!

====================

看了下面的回复有人有不同意见,最典型的就是数组和指针sizeof的结果不同。。。
其实这很好理解,,,数组名和指针,仅仅是一个标识符而已,一个标识符在可以认为是代表了不同的位置(地址),sizeof不是一个函数,而是一个运算符,该晕算符由编译器实现,编译器在解析C语句的时候,已经知道了整个数组的大小,所以它会给出数组的大小,而不只指针的大小。。。
我们说的数组名是不是指针,仅仅是在编写代码这一层,因为一旦编译之后,这些名字都会成为中间文件(*.o)里的符号而已,会失去其含有的类型信息,因为这些类型信息已经用完了,被编译器转化为偏移量、地址等等。。。这些已经是我们写代码的领域之外了。。。
所以从编写代码的角度来看,把数组名当作常量指针没有任何问题。

=====================
有必要再次声明一下,C语言中不仅不存在数组类型,也不存在char, short, int, long, float, double等等这些类型,非要说C存在一种类型,那也可以说只有一种类型:内存段。何为内存段?就是一块内存,暂时称为raw_piece.
为什么说C是一种无类型或者弱类型的语言?因为我们的计算机对待内存就是无类型的。
高级语言中的类型,可以在运行时取得该类型对象的属性,比如长度、元素个数等等,因为这些属性保存在了对象本身内部。
在C中,我们可以用struct来构造类似高级语言的这种数据类型。
在面向对象的高级语言中,一直无法完美的统一类类型 (class)和内置类型(整形,浮点型等),只好采取打包(box)和解包(unbox)等特殊方法来在必要时把内置类型封装成类类型,在不需要时再还原回来。。。
其实这有必要吗?我们有必要定义那么多复杂的类型规则吗?我们的语言,应该像C, 就一种类型:raw_piece,你想要什么样的类型,都可以从raw_piece构造出来。比如raw_piece(1)当作字符型,raw_piece(4)当作整形,raw_piece(sizeof(struct.....))当作复杂类型。。。。当然,函数库可以预先构造一些经常用到的类型,以方便使用。
我们的编程语言应该简洁,我们的世界应该简单,整个宇宙说不定只有一个定理。。爱因斯坦晚年曾经想把宇宙中的4种力(强力、弱力、电磁力和万有引力)统一成一种,这就是一种追求简单的境界。
我认为C语言还是过于复杂,C99中引入的一些现代特性根本没有必要,完全可以通过重新定义C的某些特性,通过修改库函数的定义,在不改变语言接口得情况下来满足现代需要
C需要的是一个更多功能的函数库,,只需把现在高级语言种常用的类型、特性、功得能等也纳入C的标准库,那就完全可以取代当今大部分新的语言。C是通过库函数来扩展其功能的,这个设计理念相当优秀!


[ 本帖最后由 unistd 于 2009-12-21 12:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-19 20:23 |只看该作者
lz正在学习C语言?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2009-12-19 20:25 |只看该作者
C 是有数组的……

论坛徽章:
0
4 [报告]
发表于 2009-12-19 20:27 |只看该作者
原帖由 unistd 于 2009-12-19 20:14 发表
C中的数组,仅仅是地址排列在一起的元素而已,不管是char、int还是复杂的struct数组,,仅仅是排列在一起的该类型大小的内存而已。数组的下标引用,仅仅是指针偏移的一种易读的形式!也可以说,数组在C中只是一个名字,简称而已。


有见解!

论坛徽章:
0
5 [报告]
发表于 2009-12-19 20:32 |只看该作者
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2009-12-19 20:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2009-12-19 20:34 |只看该作者
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。


a和b仅仅是在编码、编译阶段的一个符号,在最终的可执行代码中是不存在的。
把组sizeof之后得到数组的大小,只能说是C语言的一个特殊规定而已,我要是设计C语言的话,就不会做这个特殊规定,所有符号、指针,一律返回该平台地址空间的字节大小

[ 本帖最后由 unistd 于 2009-12-21 12:09 编辑 ]

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
8 [报告]
发表于 2009-12-19 20:35 |只看该作者
7楼彻底亮了

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
9 [报告]
发表于 2009-12-19 20:36 |只看该作者
C语言的数组名不是指针,说它代表一个地址更准确些。

sizeof数组名的时候可以得到数组大小

论坛徽章:
0
10 [报告]
发表于 2009-12-19 20:38 |只看该作者
原帖由 gtkmm 于 2009-12-19 20:32 发表
char a[100];
char *b;

如果a,b类型相同,必有
sizeof( a) == size( b),是吧。


这个反问比较牛!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP