為什麼C語言的陣列下標從0開始而不是從1開始

2021-03-04 03:05:38 字數 4991 閱讀 8509

1樓:匿名使用者

一種約定。

如果最初約定從1開始 那也沒什麼

至於為什麼會選擇從0開始,最重要的原因 我覺得是方便對於任意的a[i] 取值的時候 都是等效於*(a+i)a是陣列首位址,這樣訪問第乙個元素 *(a+0) 就不需要任何偏移了。

陣列下標都是從1開始的,為什麼說成是從0開始的呢?

2樓:仁昌居士

陣列下標說成是從0開始的是因為如果從1開始編號,每次隨機訪問陣列元素都多了一次減法運算,對於cpu來說,就是多了一次減法指令。陣列作為非常基礎的資料結構,通過下標訪問陣列元素又是其非常基礎的程式設計操作,效率的優化就要盡可能的做到極致。從0開始,可以減少一次減法操作。

3樓:匿名使用者

下標是指數組元素的索引號,vb預設是0,對於你的陣列dim a as variant

a=array(1,2,3,4)

a(0) 指第乙個元素,它的索引號是0,它的值是1

4樓:匿名使用者

option base 指定下標。一般是0或者是1.

為什麼陣列下標從0開始而不是從1開始?

5樓:匿名使用者

陣列是一段連續的空間,要求a[i]就是求它

的位址,然後找到它。如果從0開始,則a[i]的位址= 首位址 + i*每個資料所佔的長度;如果從1開始,則a[i]的位址= 首位址 + (i-1)*每個資料所佔的長度。

是不是前一種更好計算呢。

c/c++中陣列下標從0開始而非從1開始,為什麼?

6樓:匿名使用者

隨著你遇到的問題種類越來越多,你就會發現下標從0開始能給程式在細節上帶來的優化效果了。

比如,最基本的,確定陣列a中第i個元素的位址,如果從0開始,則a[i]的位址= 首位址 + i*每個資料所佔的長度;如果從1開始,則a[i]的位址= 首位址 + (i-1)*每個資料所佔的長度,多了乙個整數計算

7樓:紫金玄鐵

方便訪問陣列成員。

從0開始的話,只需用陣列名(也就是陣列位址),加上下標,只需要很簡單的計算,就可以記憶體中準確訪問到元素。

像在pascal這樣的語言中,陣列下標是可由人去定的。如:

vararr: array[2..4] of integer; //陣列下標從2開始,到4結束。

雖然pascal這樣的數定,在邏輯上很方便人們去理解。但從編繹器角度來講,就很麻煩了。這時,你要訪問乙個陣列元素,就不得不知道陣列的下界,還要經過轉換才能得到元素的相對指標。

如果是在多維陣列的應用中,就更顯而易見了。

c語言在工程應用中應用廣泛,就是因為他對硬體的支援效率高,

在早期硬體不是很高階的時候,將陣列下標選為0,大大提高訪問陣列速度,而且還省去了不必要的暫存器佔用。

陣列下標為什麼從0開始而不是從1開始?

8樓:愛上榛子的核桃

你可以把陣列變數看成指標,陣列下標看成位址的偏移量。

因為陣列第乙個元素的位址偏移量一定是0,所以陣列下標就是從0開始了

9樓:匿名使用者

老大,這個問題也要問。非要懂得資料結構的人才能回答嗎?

想想就很明白了。

以下假設陣列下標是從1開始的:

如果你定義

int a[100];

那麼你在使用的時候用到第100個元素a[100]的時候,請問編譯器如何能分辨你這裡的a[100]和你定義的a[100]有什麼區別呢?

假設到此為止。

現在如果你下標是從0開始的,那麼a[0] - a[99]是元素,怎麼都不可能和定義的a[100]出現名字衝突,編譯器就很容易識別了。

就這麼簡單的問題~~~

10樓:匿名使用者

也可以從1開始啊,可能與0是最小自然數有關吧…

11樓:匿名使用者

鑽語法的牛角尖沒啥意思、

語法是規定好的

就像球只能進別人的門,進自已的裁判就要吹了

12樓:小雲

為什麼「1+1」答案是2,不是3?規定的唄,同樣的道理,陣列下標也規定從0開始。

在c程式的陣列中為什麼下標要從0開始呢?從1開始不行嗎?

13樓:匿名使用者

可以,但是浪費了記憶體

,比如開闢100個儲存,int array[100]:是從0~99,而你是從一開始,必須是int array[101]了,之所以下標從0是因為pc的記憶體他的硬體實實在在就是從0位址開始索引的……

14樓:

陣列的位址與第乙個元素的位址相同,下標為多少也就是指偏移量為多少的位址,所有0開始比較方便。

還有一些歷史原因吧,有些時候設計者就是按照他的思想設計的,就是他認為的,也沒那麼多原因。

15樓:匿名使用者

c語言是老外發明的,老外都是從0開始,跟中國人習慣不同

16樓:匿名使用者

程式最終都會編譯成機器碼,如果你了解彙編的話應該知道,陣列佔用著一串連在一起的記憶體,陣列名可以理解為那一塊記憶體的首位址,下標則是偏移,定址過程就是首位址+偏移*步長,第乙個元素偏移為零,剛好等於下標,如果下標從1開始處理起來麻煩一點。

17樓:匿名使用者

在c程式的陣列中為什麼下標要從0開始呢?從1開始不行嗎?

可以。但是從0開始更節約記憶體。

c語言陣列的下標總是從0開始嗎?

18樓:水水好萌

是的,對陣列a[max](max是乙個編譯時可知的值)來說,它的第乙個和最後乙個元素分別是a[o]和almax-1)。在其它一些語言中,情況可能有所不同,例如在basic語言中陣列a[max]的元素是從a[1]到a[max],在pascal語言中則兩種方式都可行。

注意:a[max]是乙個有效的位址,但該位址中的值並不是陣列a的乙個元素。

上述這種差別有時會引起混亂,因為當你說「陣列中的第乙個元素」時,實際上是指「陣列中下標為。的元素」,這裡的「第乙個」的意思和「最後乙個」相反。

因為指標和陣列幾乎是相同的,因此你可以定義乙個指標,使它可以象乙個陣列一樣引用另乙個陣列中的所有元素,但引用時前者的下標是從1開始的:

/*don't do this!!*/

int a0[max],

int *a1=a0-1; /*&a0[-1)*/

現在,a0[0]和a1[1)是相同的,而a0[max-1]和a1[max]是相同的。然而,在實際程式設計中不應該這樣做,其原因有以下兩點:

第二,這種方式背離了c語言的常規風格。人們已經習慣了c語言中陣列下標的工作方式,如果你的程式使用了另外一種方式,別人就很難讀懂你的程式,而經過一段時間以後,連你自己都可能很難讀懂這個程式了。

為什麼在c語言定義陣列時下標必須從零開始呢?

19樓:

為了標新立異.

在c出現以前的流行語言,例如fortran 從1開始,algol可以自由定義下標從幾開始.

c語言定義從零開始.

從零開始對使用者來說沒有自由定義好,但編譯器設計簡單.省事.

20樓:張立斌

yxlovemoney mdffeng l_o_o_n_i_e

回答的都很有道理。

在c語言定義陣列時下標必須從幾開始,並不要緊,因為這是系統定義的。

無論從幾開始,我們都要會用,都要用好。

21樓:匿名使用者

這需抄要從陣列的儲存方式上襲解釋了。

定義乙個bai陣列時,系統會du分配zhi一塊連續的內

dao存,由陣列名指向該塊記憶體的首位址。

引用某個元素時,首先需要計算該元素的位址(及 陣列名 + 下標),然後根據該位址取到相應儲存單元的內容。

所以,如果希望取陣列的第乙個元素,下標必須是0

22樓:匿名使用者

就是這麼規定的,沒為什麼

23樓:匿名使用者

為了方便,不用0的話,反而更複雜。

24樓:匿名使用者

美國人計數一般都從0開始

25樓:匿名使用者

c規定的,沒什麼原因,其他語言定義是從1開始的,只是有點方便

26樓:匿名使用者

就是人要吃

bai飯,為什麼不吃屎du一樣的原因zhi,開個玩笑。

陣列是一段連續的空dao間,要求a[i]就是回求它的位址,然答後找到它。如果從0開始,則a[i]的位址= 首位址 + i*每個資料所佔的長度;如果從1開始,則a[i]的位址= 首位址 + (i-1)*每個資料所佔的長度。

那樣從0開始就更易於計算。

不過真正的還是要問其作者才知道具體意義

儲存單元為什麼從0開始編址?c語言陣列下標為什麼要從0開始?

27樓:幻夢·人生

以陣列為例,陣列是使用連續的儲存空間儲存資料。

int a[4] = ;

陣列名a代表的就是這個儲存版空間的首位址。

1儲存的權位置就是儲存空間的首位址。

而2儲存的位置就是首位址加上1個int型所需空間的位址。

以此類推

所以a[n]元素的位址,實際上就是a的位址,加上n個元素的所佔空間大小

a[n]位址 = a位址 + sizeof(int) * n;

綜上所述,陣列的下表可以理解為距離首位址的偏移量。

所以第乙個元素距離首位址的偏移量為0;因為第乙個元素的位址,就是首位址。

28樓:牛津字典喝芬達

計算機中採用二進位制,不考慮符號的情況下最小數是"0x0000",所以在計算機中起始位置都是從0開始的

c語言陣列的下標總是從0開始嗎,C語言陣列的下標總是從0開始嗎

是的,對陣列a max max是乙個編譯時可知的值 來說,它的第乙個和最後乙個元素分別是a o 和almax 1 在其它一些語言中,情況可能有所不同,例如在basic語言中陣列a max 的元素是從a 1 到a max 在pascal語言中則兩種方式都可行。注意 a max 是乙個有效的位址,但該位...

陣列下標為什麼從0開始而不是從1開始

你可以把陣列變數看成指標,陣列下標看成位址的偏移量。因為陣列第乙個元素的位址偏移量一定是0,所以陣列下標就是從0開始了 老大,這個問題也要問。非要懂得資料結構的人才能回答嗎?想想就很明白了。以下假設陣列下標是從1開始的 如果你定義 int a 100 那麼你在使用的時候用到第100個元素a 100 ...

java為什麼陣列下標從0開始,java的陣列是從零開始還是從壹開始的

陣列下標實際上是偏移量。a 0 和 a所指的都是第乙個元素。a 1 a 1 所以就有了從零開始的說法。java的陣列是從零開始還是從壹開始的 陣列下標是從0 開始的 都是從0的,沒有1的 只要記得陣列下標越界異常 就知道從0開始的 1 從0開始哈!親,你可以自己定義乙個陣列,假設int a 2 你列...