鍍金池/ 問(wèn)答/數(shù)據(jù)分析&挖掘  C/ C既然有指針為什么要發(fā)明數(shù)組?

C既然有指針為什么要發(fā)明數(shù)組?

指針可以實(shí)現(xiàn)數(shù)組的所有功能,為什么要發(fā)明數(shù)組呢?

  1. 為了寫(xiě)代碼方便,不用每次malloc申請(qǐng)內(nèi)存,由編譯器自動(dòng)完成?
  2. 效率更高?
效率更高是因?yàn)橛锌匆黄恼掠羞@方面的描述,原文地址
## 數(shù)組 ##
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
回答
編輯回答
雨蝶

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

2017年7月18日 13:02
編輯回答
忠妾

可能有不一樣的地方啊,效率和使用方式的難易等等,你這個(gè)問(wèn)題更多的應(yīng)該從"人"的角度去思考,你說(shuō)既然喲匯編語(yǔ)言了,為什么還要搞個(gè)c語(yǔ)言,其實(shí)一切都是為了能方便使用、便于理解、提高效率,從而來(lái)降低"人"的成本

2017年2月27日 20:34
編輯回答
苦妄

因?yàn)樗鼈兪莾蓚€(gè)不同的概念。就像武器里,你想想既然有了刀為什么還要發(fā)明劍?

實(shí)現(xiàn)上,的確是語(yǔ)法糖。CPU 其實(shí)也就認(rèn)識(shí)幾種整型和浮點(diǎn)數(shù)而已,哪里有什么數(shù)據(jù)結(jié)構(gòu)呢。對(duì)于 C 來(lái)說(shuō),數(shù)組和指針的類(lèi)型是不同的,你不能混用只能轉(zhuǎn)換,只有數(shù)組作為參數(shù)傳遞的時(shí)候因?yàn)榇笮⌒畔o(wú)法傳遞而退化成指針。數(shù)組除了有元素的類(lèi)型之外,還有長(zhǎng)度信息的。

另外,你提供的例子不是等價(jià)的。前者是棧上分配,后者是堆上分配,效率差很多的。

2017年12月9日 23:34
編輯回答
不討喜

我從一個(gè)特定的角度來(lái)看,如果都直接操作指針會(huì)讓人難以理解,可以理解為數(shù)組是一個(gè)語(yǔ)法糖,想多點(diǎn),高級(jí)語(yǔ)言不都是低級(jí)語(yǔ)言的語(yǔ)法糖嘛,語(yǔ)法糖的目的就是讓人好操作。

2017年8月21日 13:49
編輯回答
深記你

數(shù)組和指針肯定不是一個(gè)東西,之所以引入數(shù)組,我認(rèn)為主要還是概念易理解:指針是一個(gè)比較低級(jí)的概念,數(shù)組的抽象程度要高于指針。舉幾個(gè)例子:C/C++中的struct同樣可以用指針實(shí)現(xiàn),為什么還要引入它呢;Continuation可以實(shí)現(xiàn)順序、分支、循環(huán)各種控制邏輯,但幾乎每種語(yǔ)言都單獨(dú)提供分支、循環(huán)的語(yǔ)法。
至于數(shù)組的其他優(yōu)點(diǎn),比如靜態(tài)編譯,效率高;有自己的數(shù)據(jù)類(lèi)型,編譯安全等等,都不是非主要因素。

2017年10月10日 23:11
編輯回答
厭遇

數(shù)組并不是C發(fā)明的,C語(yǔ)言1972年才出現(xiàn)。比它早的50、60年代的高級(jí)語(yǔ)言BASIC、COBOL、Lisp、FORTRAN、Pascal都有數(shù)組的概念。這是高級(jí)語(yǔ)言的特性,畢竟同一類(lèi)型的數(shù)據(jù)批量處理放在一起是十分基礎(chǔ)的需求。相對(duì)于匯編語(yǔ)言的內(nèi)存偏移訪(fǎng)問(wèn),數(shù)組很方便的。
只不過(guò)C語(yǔ)言設(shè)計(jì)時(shí)故意把它和指針設(shè)計(jì)為很接近的使用方式,數(shù)組下標(biāo)等效于指針加偏移。嚴(yán)格意義上數(shù)組的實(shí)現(xiàn)和指針是有一定區(qū)別的。比如全局?jǐn)?shù)組是預(yù)分配的在DATA區(qū)或者記錄在BSS區(qū),局部數(shù)組則是棧中的。

2017年12月24日 17:18
編輯回答
好難瘦

確實(shí)就是糖,然后你會(huì)發(fā)現(xiàn)面向?qū)ο缶褪墙Y(jié)構(gòu)體+指針。其實(shí)這些都不矛盾。計(jì)算機(jī)也這么多年歷史了,不能說(shuō)會(huì)用0101編程的人才是程序員吧。

2018年5月23日 03:16
編輯回答
深記你

語(yǔ)言層面支持?jǐn)?shù)組是必然的,數(shù)組多么基礎(chǔ)多么常用多么直接的數(shù)據(jù)組織方式啊,如果連這都不支持還好意思拿出來(lái)?
C語(yǔ)言是提供了更基礎(chǔ)的指針和地址操作,但這功能距離“數(shù)組”就是半張紙的厚度何不直接捅破呢?

一般我們開(kāi)發(fā)產(chǎn)品也是這樣,再使用最正交的方式提供完所有功能后,還會(huì)給常用功能提供快捷方式。

2018年7月12日 08:37
編輯回答
悶油瓶

首先你要清楚,數(shù)組跟指針區(qū)別,他們真的一樣嗎?他們并不一樣。
我簡(jiǎn)單的舉幾個(gè)例子,
1、我定義數(shù)組后,如果定義的是靜態(tài)數(shù)組,那么他在編譯鏈接時(shí)就會(huì)把這塊內(nèi)存申請(qǐng)下來(lái),而你指針申請(qǐng)的內(nèi)存是運(yùn)行時(shí)才申請(qǐng)的。
2、指針指向的是一塊內(nèi)存區(qū)域的地址,而數(shù)組的首地址代表的是這塊內(nèi)存區(qū)域的首地址。所以在實(shí)際運(yùn)算時(shí),或許數(shù)組更快,因?yàn)橹羔樀姆绞叫枰雀鶕?jù)指針變量找這個(gè)內(nèi)存區(qū)域,而數(shù)組地址代表的就是這塊內(nèi)存區(qū)域(這個(gè)點(diǎn)可以參考C專(zhuān)家編程的第四章)。
當(dāng)然如果你malloc一塊內(nèi)存,然后用數(shù)組的方式來(lái)訪(fǎng)問(wèn),確實(shí)數(shù)組就是指針的語(yǔ)法糖。
但是數(shù)組跟指針還是有區(qū)別的。

2018年6月4日 04:32
編輯回答
野橘
    C語(yǔ)言有了數(shù)組這個(gè)數(shù)據(jù)類(lèi)型,數(shù)組的訪(fǎng)問(wèn)方式必然是變址尋址的方式。
    首先,程序在運(yùn)行中會(huì)為數(shù)組申請(qǐng)一個(gè)內(nèi)存空間以用來(lái)儲(chǔ)存和訪(fǎng)問(wèn)數(shù)據(jù),具體的訪(fǎng)問(wèn)方式就像這樣:
    movl data_items(,%ecx,1),%eax
    數(shù)組名就是首地址,而數(shù)組的下標(biāo)其實(shí)就是偏移。數(shù)組有多少個(gè)元素,程序就會(huì)申請(qǐng)相應(yīng)的大小的內(nèi)存空間,如果數(shù)組較小的話(huà),它會(huì)存儲(chǔ)在.text段,如果較大的話(huà),會(huì)在.data段。
    可以知道的是,數(shù)組元素的空間其實(shí)是連在一起的。
    而指針?biāo)怯脕?lái)儲(chǔ)存地址的一種數(shù)據(jù)結(jié)構(gòu),程序只會(huì)為它本身分配空間,并不負(fù)責(zé)它所指的數(shù)據(jù)類(lèi)型分配空間。所以,能夠用數(shù)組名加下標(biāo)的前提,是因?yàn)閿?shù)組本身分配有空間,可以用這種形式訪(fǎng)問(wèn)。
    類(lèi)似的還有字符串,因?yàn)樗莄har *類(lèi)型,程序會(huì)為它分配空間,所以才可以用數(shù)組名加下標(biāo)的形式訪(fǎng)問(wèn)。
    如果沒(méi)有數(shù)組,那指針怎么實(shí)現(xiàn)這種方式訪(fǎng)問(wèn)?所以指針并不可以實(shí)現(xiàn)數(shù)組的全部功能。
    但是,為什么要發(fā)明數(shù)組呢?
    從實(shí)際操作中,大概也可以體會(huì)到,數(shù)組這種結(jié)構(gòu)有連續(xù)存儲(chǔ)優(yōu)點(diǎn),可以實(shí)現(xiàn)數(shù)據(jù)分組的情況;第二,遍歷數(shù)組的形式很方便;第三可以存儲(chǔ)大量的數(shù)據(jù);最后還有一點(diǎn)就是編譯的效率。
2018年5月26日 17:26