c语言声明数组类型,严重声明:C语言中不存在数组的类型!它仅仅是一个概念!...

这篇博客探讨了C语言中数组的本质,指出C语言的数组并非像其他高级语言那样具有固定类型和元素个数,而是地址连续的元素集合。作者强调在C语言中,数组操作实际上是对指针的偏移,数组名本质上是一个常量指针。他还提到,从汇编语言的角度理解C语言的数组和指针行为更有助于深入理解。博客还讨论了数组名和指针在sizeof运算符下的不同表现,并强调了从内存布局角度思考C语言问题的重要性。
摘要由CSDN通过智能技术生成

严重声明: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)里的符号而已,会失去其含有的类型信息,因为这些类型信息已经用完了,被编译器转化为偏移量、地址等等。。。这些已经是我们写代码的领域之外了。。。

所以从

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值