严重声明:C语言中不存在数组的类型!它仅仅是一个概念!
(2012-06-08 04:52:40)
标签:
概念
声明
c语言
杂谈
严重声明:C语言中不存在数组的类型!它仅仅是一个概念!在以他一些高级语言中,大都存在一种数组的类型,,该类型包含了若干元素,还有元素个数等其它属性。这些数组类型的对象是被当作一个整体来对待的。。。
但是在C中,可以说,不存在这种高级语言的数组类型,,C中的数组,仅仅是地址排列在一起的元素而已,不管是char、int还是复杂的struct数组,,仅仅是排列在一起的该类型大小的内存而已。数组的下标引用,仅仅是指针偏移的一种易读的形式!也可以说,数组在C中只是一个名字,简称而已。
如果你定义了一堆类型相同的变量,比如int a, b, c, d, e, f,
.....只要它们编译后的内存地址是连续的,那么你也可以用数组的方式使用它们:
int *p = &a;
p = 1; //a
p = 2; //b
p = 3; //c
......
我觉得,在考虑C语言的任何问题的时候,都必须在大脑中画出一个内存空间来,,你所有的变量、函数什么的,都排列在这些空间上,然后,一切就都容易理解了。。。。
所以说,那个关于数组名能不能减1的帖子,根本没有必要讨论那么多页,,数组名仅仅是一个指针而已,它的类型为数组的元素类型的指针,,只是通常这个指针指向第一个元素,而且为常量而已!
对编译器来说,任何类型的指针,仅仅是指向的内存大小不同,其它都按照相同的对待!
所以数组名减一,就好比一个指针减一效果一样。
大家别忘了,,C语言之前还是汇编和机器语言,,丹尼斯瑞奇它们不可能从汇编时代一下子就设计到21世纪计算机发展水瓶,所以C的很多设计,其实就是汇编语言的设计
在汇编中也存在一种字符串拷贝命令MOVSB,把首地址放入一个寄存器(好像是SI),然后把数量放入另一个寄存器(好像是CX),随后是目的地址寄存器(好像是DI),
可以看出,汇编语言中的字符串拷贝命令和C中的数组命令是类似的,就是要求地址连续!
从汇编、机器、硬件的角度思考C语言的问题,才是正确地道路。。而且几十年来,到了今天,计算机仍然是几十年前的体系结构,就算出来更多的java/net,C的这种工作方式仍然是有效的,,这是当代计算机软件的基础!
====================
看了下面的回复有人有不同意见,最典型的就是数组和指针sizeof的结果不同。。。
其实这很好理解,,,数组名和指针,仅仅是一个标识符而已,一个标识符在可以认为是代表了不同的位置(地址),sizeof不是一个函数,而是一个运算符,该晕算符由编译器实现,编译器在解析C语句的时候,已经知道了整个数组的大小,所以它会给出数组的大小,而不只指针的大小。。。
我们说的数组名是不是指针,仅仅是在编写代码这一层,因为一旦编译之后,这些名字都会成为中间文件(*.o)里的符号而已,会失去其含有的类型信息,因为这些类型信息已经用完了,被编译器转化为偏移量、地址等等。。。这些已经是我们写代码的领域之外了。。。
所以从
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。