第 11 講:數(shù)組
數(shù)組是什么?
在前文的知識點里,我們描述了很多有關重復性的內(nèi)容,例如 C 語言提供的三大循環(huán)語句:while
、do-while
和 for
循環(huán),還談論了 for
的各種“奇葩”用法。今天要講的重復性內(nèi)容,并非針對執(zhí)行操作,而是針對于數(shù)值存儲。
試想一下,如果我們需要大量信息,而且它們需要的內(nèi)容的類型近乎一致。比如我們要存儲 50 個學生的數(shù)學成績,如果我們單純使用 50 個變量的話,顯然是不好讀也不好取。那么,有沒有辦法解決呢?有,這便是我們今天要說到的新的知識點:數(shù)組(Array)。
數(shù)組的定義
數(shù)組有類型(Type)一說,有維度(Rank)一說,也有長度(Length)一說,這是在初始定義的時候為其決定的,這類似于變量的定義。語法約定是這樣的:
這樣便定義了一個數(shù)組(有時候也把數(shù)組直接叫做數(shù)組變量),這個數(shù)組一共存放 50 個元素,且全部都是 int
類型的元素。
數(shù)組一共具有三大屬性:類型、維度和長度,那么針對于這個數(shù)組變量而言,它的類型是 int
,維度是一維的,而長度是 50(即總元素個數(shù))。所謂的維度,就是數(shù)組整體呈現(xiàn)幾個維度的形式。我們今天講的內(nèi)容都是一維數(shù)組,即只有一個維度。
數(shù)組的賦值
數(shù)組賦值有兩種操作,一種是自定義數(shù)據(jù),在初始化的方式賦值,還有一種是后續(xù)賦值,后續(xù)賦值就需要借助循環(huán)語句來實現(xiàn),因為它是采用的逐個元素的賦值的邏輯。
初始化賦值
初始化賦值方式是在定義語句上直接使用賦值符號 =
和一個大括號表示的集合序列來賦值的。
下面為了簡化賦值,這里把 50 個元素更改為 10 個元素的數(shù)組,進行賦值。
這樣的賦值操作是逐個對應的。這個 scores
數(shù)組的第一個元素數(shù)值是 1,第二個元素是 2,第三個是 4,第四個是 8,以此類推。
如果你賦值的數(shù)值過多,編譯器層面就會報錯,提示你不遵循語法規(guī)則,exe 的文件都不會讓你成功生成。
不過,元素如果不夠 10 個的話,賦值是成功的,也是不會出錯的,但是剩余的元素都會被默認賦值為 0。
這表示 scores
數(shù)組里最后 6 個元素全部為 0。
如果你想把數(shù)組全部賦值為 0,可以采用下面兩種方式賦值:
這是第一種賦值方式,小括號第一個部分寫上數(shù)組名稱,第二個部分寫上賦值的初始值(這里是 0,其它數(shù)值需要非常復雜的轉(zhuǎn)換得到,這里不作出講解),第三個部分寫上數(shù)組整體占的內(nèi)存大小。
第二種是用大括號這種熟悉的方式賦值,只需要在大括號里寫一個元素 0 即可。
這樣就可以了,因為其它沒有賦值的部分都會默認賦值為 0,而此時給了第一個元素也賦值為 0,所以相當于就是全部為 0 了。
在明確賦值元素足夠的時候,中括號里的數(shù)值可以不寫。比如
?int scores[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };就等價于
?int scores[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };中括號里的數(shù)值,就等于后面大括號里元素的總個數(shù) 10 個。
后續(xù)賦值
你也可以借用循環(huán)語句賦值,但需要講解存取數(shù)組的元素的語法才可以?,F(xiàn)在我們來說一下,如何取出數(shù)組里的元素,和修改這些元素的值。
數(shù)組初始化的長度是否可以用變量表示?
思考一個問題。我們是否可以用一個變量來表示數(shù)組的長度呢?
這么書寫,是否表示輸入的數(shù)值是多少,數(shù)組初始化的時候長度就是多少呢?
在 C99 標準之前,這種寫法一直都是不被允許的。在考試過程時,一般也不允許這種寫法,不過 C99 標準開始允許你這么聲明數(shù)組,即可變長數(shù)組(Variable Length Array,簡稱 VLA)。VLA 這種特性是在 C99 標準才引入的,所以如果你需要使用 VLA,考試里則是肯定不允許的。
數(shù)組內(nèi)元素的存取
前文講述了如何使用數(shù)組進行定義和初始化,它采用的是中括號的方式,寫在數(shù)組名稱的后面,中括號里寫上總元素個數(shù)來表達。
在存取元素的時候,我們依舊用的是中括號,而且稍微在使用上和初始化里的中括號有一點區(qū)別:
[第幾個元素 - 1]
在 C 語言里,取值是從 0 開始的,并非 1 開始,所以需要你注意數(shù)組取值的時候,中括號里寫的數(shù)值是多少。比如取出第三個元素,則寫的是 array[2]
,而非 array[3]
。
那么,整體使用的格式是這樣的:
這個程序?qū)敵?96。
下面就可以說下后續(xù)賦值的方式了。
由于我們學習了循環(huán)語句,所以我們可以采用方便 for
循環(huán)為其賦值。
請注意,數(shù)組賦值用到了 for
循環(huán),而我們之前說過,取值的中括號里寫的數(shù)字是從 0 開始算的,所以最大的元素值是 9(因為 0 到 9 一共是 10 個元素了),所以初始化賦值的時候 i = 0
而不是 i = 1
,因為這個 i
就是表示這個中括號里的數(shù)值的;而條件寫的是 i < 10
而不是 i <= 10
。
而上述邏輯里的 arr[i]
就表示 arr
數(shù)組的第 i + 1
個元素。比如 i
是 6,則 arr[i]
就表示的是第七個元素,因為從 0 開始計算。而最終執(zhí)行完畢這個 for
后,整個數(shù)組的數(shù)值就是 1、2、3、4、5、6、7、8、9、10 了。
當然,你還可以為其進行手動賦值:
這樣就可以為這個數(shù)組的第 2、7、10 個元素賦值 3、8 和 14,而其余元素的數(shù)值都會被默認初始化為 0。