指針可以實(shí)現(xiàn)數(shù)組的所有功能,為什么要發(fā)明數(shù)組呢?
效率更高是因?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
因?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ù)組和指針的類型是不同的,你不能混用只能轉(zhuǎn)換,只有數(shù)組作為參數(shù)傳遞的時(shí)候因?yàn)榇笮⌒畔o(wú)法傳遞而退化成指針。數(shù)組除了有元素的類型之外,還有長(zhǎng)度信息的。
另外,你提供的例子不是等價(jià)的。前者是棧上分配,后者是堆上分配,效率差很多的。
數(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ù)類型,編譯安全等等,都不是非主要因素。
數(shù)組并不是C發(fā)明的,C語(yǔ)言1972年才出現(xiàn)。比它早的50、60年代的高級(jí)語(yǔ)言BASIC、COBOL、Lisp、FORTRAN、Pascal都有數(shù)組的概念。這是高級(jí)語(yǔ)言的特性,畢竟同一類型的數(shù)據(jù)批量處理放在一起是十分基礎(chǔ)的需求。相對(duì)于匯編語(yǔ)言的內(nèi)存偏移訪問(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ù)組則是棧中的。
首先你要清楚,數(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專家編程的第四章)。
當(dāng)然如果你malloc一塊內(nèi)存,然后用數(shù)組的方式來(lái)訪問(wèn),確實(shí)數(shù)組就是指針的語(yǔ)法糖。
但是數(shù)組跟指針還是有區(qū)別的。
C語(yǔ)言有了數(shù)組這個(gè)數(shù)據(jù)類型,數(shù)組的訪問(wèn)方式必然是變址尋址的方式。
首先,程序在運(yùn)行中會(huì)為數(shù)組申請(qǐng)一個(gè)內(nèi)存空間以用來(lái)儲(chǔ)存和訪問(wèn)數(shù)據(jù),具體的訪問(wèn)方式就像這樣:
movl data_items(,%ecx,1),%eax
數(shù)組名就是首地址,而數(shù)組的下標(biāo)其實(shí)就是偏移。數(shù)組有多少個(gè)元素,程序就會(huì)申請(qǐng)相應(yīng)的大小的內(nèi)存空間,如果數(shù)組較小的話,它會(huì)存儲(chǔ)在.text段,如果較大的話,會(huì)在.data段。
可以知道的是,數(shù)組元素的空間其實(shí)是連在一起的。
而指針?biāo)怯脕?lái)儲(chǔ)存地址的一種數(shù)據(jù)結(jié)構(gòu),程序只會(huì)為它本身分配空間,并不負(fù)責(zé)它所指的數(shù)據(jù)類型分配空間。所以,能夠用數(shù)組名加下標(biāo)的前提,是因?yàn)閿?shù)組本身分配有空間,可以用這種形式訪問(wèn)。
類似的還有字符串,因?yàn)樗莄har *類型,程序會(huì)為它分配空間,所以才可以用數(shù)組名加下標(biāo)的形式訪問(wèn)。
如果沒(méi)有數(shù)組,那指針怎么實(shí)現(xiàn)這種方式訪問(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)就是編譯的效率。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。