指針可以實現(xiàn)數(shù)組的所有功能,為什么要發(fā)明數(shù)組呢?
效率更高是因為有看一篇文章有這方面的描述,原文地址
## 數(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], 1Arrays 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
數(shù)組并不是C發(fā)明的,C語言1972年才出現(xiàn)。比它早的50、60年代的高級語言BASIC、COBOL、Lisp、FORTRAN、Pascal都有數(shù)組的概念。這是高級語言的特性,畢竟同一類型的數(shù)據(jù)批量處理放在一起是十分基礎(chǔ)的需求。相對于匯編語言的內(nèi)存偏移訪問,數(shù)組很方便的。
只不過C語言設(shè)計時故意把它和指針設(shè)計為很接近的使用方式,數(shù)組下標等效于指針加偏移。嚴格意義上數(shù)組的實現(xiàn)和指針是有一定區(qū)別的。比如全局數(shù)組是預(yù)分配的在DATA區(qū)或者記錄在BSS區(qū),局部數(shù)組則是棧中的。
首先你要清楚,數(shù)組跟指針區(qū)別,他們真的一樣嗎?他們并不一樣。
我簡單的舉幾個例子,
1、我定義數(shù)組后,如果定義的是靜態(tài)數(shù)組,那么他在編譯鏈接時就會把這塊內(nèi)存申請下來,而你指針申請的內(nèi)存是運行時才申請的。
2、指針指向的是一塊內(nèi)存區(qū)域的地址,而數(shù)組的首地址代表的是這塊內(nèi)存區(qū)域的首地址。所以在實際運算時,或許數(shù)組更快,因為指針的方式需要先根據(jù)指針變量找這個內(nèi)存區(qū)域,而數(shù)組地址代表的就是這塊內(nèi)存區(qū)域(這個點可以參考C專家編程的第四章)。
當然如果你malloc一塊內(nèi)存,然后用數(shù)組的方式來訪問,確實數(shù)組就是指針的語法糖。
但是數(shù)組跟指針還是有區(qū)別的。
C語言有了數(shù)組這個數(shù)據(jù)類型,數(shù)組的訪問方式必然是變址尋址的方式。
首先,程序在運行中會為數(shù)組申請一個內(nèi)存空間以用來儲存和訪問數(shù)據(jù),具體的訪問方式就像這樣:
movl data_items(,%ecx,1),%eax
數(shù)組名就是首地址,而數(shù)組的下標其實就是偏移。數(shù)組有多少個元素,程序就會申請相應(yīng)的大小的內(nèi)存空間,如果數(shù)組較小的話,它會存儲在.text段,如果較大的話,會在.data段。
可以知道的是,數(shù)組元素的空間其實是連在一起的。
而指針它是用來儲存地址的一種數(shù)據(jù)結(jié)構(gòu),程序只會為它本身分配空間,并不負責它所指的數(shù)據(jù)類型分配空間。所以,能夠用數(shù)組名加下標的前提,是因為數(shù)組本身分配有空間,可以用這種形式訪問。
類似的還有字符串,因為它是char *類型,程序會為它分配空間,所以才可以用數(shù)組名加下標的形式訪問。
如果沒有數(shù)組,那指針怎么實現(xiàn)這種方式訪問?所以指針并不可以實現(xiàn)數(shù)組的全部功能。
但是,為什么要發(fā)明數(shù)組呢?
從實際操作中,大概也可以體會到,數(shù)組這種結(jié)構(gòu)有連續(xù)存儲優(yōu)點,可以實現(xiàn)數(shù)據(jù)分組的情況;第二,遍歷數(shù)組的形式很方便;第三可以存儲大量的數(shù)據(jù);最后還有一點就是編譯的效率。北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。