C既然有指针为什么要发明数组?

发布于 2022-09-06 12:39:10 字数 674 浏览 17 评论 0

指针可以实现数组的所有功能,为什么要发明数组呢?

  1. 为了写代码方便,不用每次malloc申请内存,由编译器自动完成?
  2. 效率更高?
效率更高是因为有看一篇文章有这方面的描述,原文地址
## 数组 ##
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

紙鸢 2022-09-13 12:39:10

可能有不一样的地方啊,效率和使用方式的难易等等,你这个问题更多的应该从"人"的角度去思考,你说既然哟汇编语言了,为什么还要搞个c语言,其实一切都是为了能方便使用、便于理解、提高效率,从而来降低"人"的成本

冷夜 2022-09-13 12:39:10

首先你要清楚,数组跟指针区别,他们真的一样吗?他们并不一样。
我简单的举几个例子,
1、我定义数组后,如果定义的是静态数组,那么他在编译链接时就会把这块内存申请下来,而你指针申请的内存是运行时才申请的。
2、指针指向的是一块内存区域的地址,而数组的首地址代表的是这块内存区域的首地址。所以在实际运算时,或许数组更快,因为指针的方式需要先根据指针变量找这个内存区域,而数组地址代表的就是这块内存区域(这个点可以参考C专家编程的第四章)。
当然如果你malloc一块内存,然后用数组的方式来访问,确实数组就是指针的语法糖。
但是数组跟指针还是有区别的。

各自安好 2022-09-13 12:39:10

因为它们是两个不同的概念。就像武器里,你想想既然有了刀为什么还要发明剑?

实现上,的确是语法糖。CPU 其实也就认识几种整型和浮点数而已,哪里有什么数据结构呢。对于 C 来说,数组和指针的类型是不同的,你不能混用只能转换,只有数组作为参数传递的时候因为大小信息无法传递而退化成指针。数组除了有元素的类型之外,还有长度信息的。

另外,你提供的例子不是等价的。前者是栈上分配,后者是堆上分配,效率差很多的。

顾忌 2022-09-13 12:39:10

我从一个特定的角度来看,如果都直接操作指针会让人难以理解,可以理解为数组是一个语法糖,想多点,高级语言不都是低级语言的语法糖嘛,语法糖的目的就是让人好操作。

沫离伤花 2022-09-13 12:39:10

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

染年凉城似染瑾 2022-09-13 12:39:10

数组并不是C发明的,C语言1972年才出现。比它早的50、60年代的高级语言BASIC、COBOL、Lisp、FORTRAN、Pascal都有数组的概念。这是高级语言的特性,毕竟同一类型的数据批量处理放在一起是十分基础的需求。相对于汇编语言的内存偏移访问,数组很方便的。
只不过C语言设计时故意把它和指针设计为很接近的使用方式,数组下标等效于指针加偏移。严格意义上数组的实现和指针是有一定区别的。比如全局数组是预分配的在DATA区或者记录在BSS区,局部数组则是栈中的。

一个人的夜不怕黑 2022-09-13 12:39:10

数组和指针肯定不是一个东西,之所以引入数组,我认为主要还是概念易理解:指针是一个比较低级的概念,数组的抽象程度要高于指针。举几个例子:C/C++中的struct同样可以用指针实现,为什么还要引入它呢;Continuation可以实现顺序、分支、循环各种控制逻辑,但几乎每种语言都单独提供分支、循环的语法。
至于数组的其他优点,比如静态编译,效率高;有自己的数据类型,编译安全等等,都不是非主要因素。

烟花肆意 2022-09-13 12:39:10

确实就是糖,然后你会发现面向对象就是结构体+指针。其实这些都不矛盾。计算机也这么多年历史了,不能说会用0101编程的人才是程序员吧。

浊酒尽余欢 2022-09-13 12:39:10

语言层面支持数组是必然的,数组多么基础多么常用多么直接的数据组织方式啊,如果连这都不支持还好意思拿出来?
C语言是提供了更基础的指针和地址操作,但这功能距离“数组”就是半张纸的厚度何不直接捅破呢?

一般我们开发产品也是这样,再使用最正交的方式提供完所有功能后,还会给常用功能提供快捷方式。

╰沐子 2022-09-13 12:39:10
    C语言有了数组这个数据类型,数组的访问方式必然是变址寻址的方式。
    首先,程序在运行中会为数组申请一个内存空间以用来储存和访问数据,具体的访问方式就像这样:
    movl data_items(,%ecx,1),%eax
    数组名就是首地址,而数组的下标其实就是偏移。数组有多少个元素,程序就会申请相应的大小的内存空间,如果数组较小的话,它会存储在.text段,如果较大的话,会在.data段。
    可以知道的是,数组元素的空间其实是连在一起的。
    而指针它是用来储存地址的一种数据结构,程序只会为它本身分配空间,并不负责它所指的数据类型分配空间。所以,能够用数组名加下标的前提,是因为数组本身分配有空间,可以用这种形式访问。
    类似的还有字符串,因为它是char *类型,程序会为它分配空间,所以才可以用数组名加下标的形式访问。
    如果没有数组,那指针怎么实现这种方式访问?所以指针并不可以实现数组的全部功能。
    但是,为什么要发明数组呢?
    从实际操作中,大概也可以体会到,数组这种结构有连续存储优点,可以实现数据分组的情况;第二,遍历数组的形式很方便;第三可以存储大量的数据;最后还有一点就是编译的效率。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文