在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

  1. 為了寫代碼方便,不用每次malloc申請內(nèi)存,由編譯器自動完成?
  2. 效率更高?
效率更高是因為有看一篇文章有這方面的描述,原文地址
## 數(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
編輯回答
忠妾

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

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

因為它們是兩個不同的概念。就像武器里,你想想既然有了刀為什么還要發(fā)明劍?

實現(xiàn)上,的確是語法糖。CPU 其實也就認識幾種整型和浮點數(shù)而已,哪里有什么數(shù)據(jù)結(jié)構(gòu)呢。對于 C 來說,數(shù)組和指針的類型是不同的,你不能混用只能轉(zhuǎn)換,只有數(shù)組作為參數(shù)傳遞的時候因為大小信息無法傳遞而退化成指針。數(shù)組除了有元素的類型之外,還有長度信息的。

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

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

我從一個特定的角度來看,如果都直接操作指針會讓人難以理解,可以理解為數(shù)組是一個語法糖,想多點,高級語言不都是低級語言的語法糖嘛,語法糖的目的就是讓人好操作。

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

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

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

數(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ù)組則是棧中的。

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

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

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

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

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

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

首先你要清楚,數(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ū)別的。

2018年6月4日 04:32
編輯回答
野橘
    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ù);最后還有一點就是編譯的效率。
2018年5月26日 17:26