C既然有指针为什么要发明数组?
指针可以实现数组的所有功能,为什么要发明数组呢?
- 为了写代码方便,不用每次malloc申请内存,由编译器自动完成?
- 效率更高?
效率更高是因为有看一篇文章有这方面的描述,原文地址
## 数组 ##
int main()
{
int foo[] = {1};
int bar = 1;
return 0;
}
## 反编译后 ##
mov DWORD PTR [esp+8], 1
mov DWORD PTR [esp+12], 1
## 指针 ##
#include <stdlib.h>
int main()
{
int *foo = (int *)malloc(sizeof (int));
*foo = 1;
return 0;
}
## 反编译后 ##
mov DWORD PTR [esp], 4
call _malloc
mov DWORD PTR [esp+28], eax
mov eax, DWORD PTR [esp+28]
mov DWORD PTR [eax], 1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
可能有不一样的地方啊,效率和使用方式的难易等等,你这个问题更多的应该从"人"的角度去思考,你说既然哟汇编语言了,为什么还要搞个c语言,其实一切都是为了能方便使用、便于理解、提高效率,从而来降低"人"的成本
首先你要清楚,数组跟指针区别,他们真的一样吗?他们并不一样。
我简单的举几个例子,
1、我定义数组后,如果定义的是静态数组,那么他在编译链接时就会把这块内存申请下来,而你指针申请的内存是运行时才申请的。
2、指针指向的是一块内存区域的地址,而数组的首地址代表的是这块内存区域的首地址。所以在实际运算时,或许数组更快,因为指针的方式需要先根据指针变量找这个内存区域,而数组地址代表的就是这块内存区域(这个点可以参考C专家编程的第四章)。
当然如果你malloc一块内存,然后用数组的方式来访问,确实数组就是指针的语法糖。
但是数组跟指针还是有区别的。
因为它们是两个不同的概念。就像武器里,你想想既然有了刀为什么还要发明剑?
实现上,的确是语法糖。CPU 其实也就认识几种整型和浮点数而已,哪里有什么数据结构呢。对于 C 来说,数组和指针的类型是不同的,你不能混用只能转换,只有数组作为参数传递的时候因为大小信息无法传递而退化成指针。数组除了有元素的类型之外,还有长度信息的。
另外,你提供的例子不是等价的。前者是栈上分配,后者是堆上分配,效率差很多的。
我从一个特定的角度来看,如果都直接操作指针会让人难以理解,可以理解为数组是一个语法糖,想多点,高级语言不都是低级语言的语法糖嘛,语法糖的目的就是让人好操作。
Arrays and pointers is different things.
You can do similar operator on them though, but these just syntax sugar.
Some link about this:
pointers-cppreference
arrays-cppreference
difference-between-array-and-pointer
数组并不是C发明的,C语言1972年才出现。比它早的50、60年代的高级语言BASIC、COBOL、Lisp、FORTRAN、Pascal都有数组的概念。这是高级语言的特性,毕竟同一类型的数据批量处理放在一起是十分基础的需求。相对于汇编语言的内存偏移访问,数组很方便的。
只不过C语言设计时故意把它和指针设计为很接近的使用方式,数组下标等效于指针加偏移。严格意义上数组的实现和指针是有一定区别的。比如全局数组是预分配的在DATA区或者记录在BSS区,局部数组则是栈中的。
数组和指针肯定不是一个东西,之所以引入数组,我认为主要还是概念易理解:指针是一个比较低级的概念,数组的抽象程度要高于指针。举几个例子:C/C++中的
struct
同样可以用指针实现,为什么还要引入它呢;Continuation
可以实现顺序、分支、循环各种控制逻辑,但几乎每种语言都单独提供分支、循环的语法。至于数组的其他优点,比如静态编译,效率高;有自己的数据类型,编译安全等等,都不是非主要因素。
确实就是糖,然后你会发现面向对象就是结构体+指针。其实这些都不矛盾。计算机也这么多年历史了,不能说会用0101编程的人才是程序员吧。
语言层面支持数组是必然的,数组多么基础多么常用多么直接的数据组织方式啊,如果连这都不支持还好意思拿出来?
C语言是提供了更基础的指针和地址操作,但这功能距离“数组”就是半张纸的厚度何不直接捅破呢?
一般我们开发产品也是这样,再使用最正交的方式提供完所有功能后,还会给常用功能提供快捷方式。