Chinaunix首页 | 论坛 | 博客
  • 博客访问: 767414
  • 博文数量: 455
  • 博客积分: 9776
  • 博客等级: 中将
  • 技术积分: 5870
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-19 23:23
文章分类

全部博文(455)

文章存档

2011年(455)

分类: C/C++

2011-04-26 10:55:49

在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。

但是在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是通过库函数来扩展其功能的,这个设计理念相当优秀!

阅读(1882) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

lanling2019-04-18 17:41:39

同感

lanling2019-04-18 17:41:35

同感