{eval=Array;=+count(Array);}
謝邀。
C語言已經是非常簡潔的編程語言了,數組肯定不是多余的語法了??梢哉f,數組基本上是所有現代高級編程語言不可或缺的語法了。但是C語言中的數組并不難,題主也不用太擔心自己學不會。
我的上一個回答,討論了C語言中的結構體,它是一種復合數據類型,有了結構體,C語言可以應對各種復雜的數據模型,比如上一節的平行四邊形問題。
但是有些問題,就算是結構體,也很難解決。請看下面這個問題:
小明班級有 60 個人,期末考試出成績后,編寫C語言程序找出這 60 個人的最高得分。
這當然不是什么難題,會判斷兩個數的大小就能解決這個問題。只不過,這 60 個人的成績怎么用 C 語言描述呢?定義 60 個變量?這樣是不是太麻煩了?就算不嫌麻煩,比較兩個數大小的邏輯怎么寫呢,每兩個變量就得寫一個 if ?
和結構體類似,數組也是一種復合數據類型,只不過,數組是由一系列相同類型的元素組成的。比如上面 60 人的成績得分,每一個人的得分在C語言中都可以用 float 來定義,屬于同一數據類型,所以這 60 個人的成績得分,在C語言中可以定義為:
float score[60];
score 后面的 [60] 表示一共有 60 個 score 這樣的(即 float 類型的)數據,所以 60 個同學的成績得分,C語言程序定義這么一個數組就可以了,并不需要定義多個變量。如果人數更多,把 60 改大些就可以解決。
請看上圖,我們用方框表示數組的存儲單元(元素),一系列方框在一起組成了數組。方框里面的數字是成績得分,方框外面的數字是數組的下標,每個存儲單元可以用數組名+下標訪問:score[0],score[1],score[28] 等等。
注意,在定義數組時,float score[60]; 這里的 60 表示數組長度,而在訪問時, score[60] 這里的 60 是指 score 數組的第 60 個元素。
和我們平常數數不同,數組元素是從“第0個”開始數的,大多數編程語言都是這么規定的。這樣規定使得訪問數組元素非常方便,比如 score 數組中的每個元素占 4 個字節,則 score[i] 位于從數組開頭跳過 4 * i 個字節的存儲位置。score[i] 也可以做左值,i 也可以是表達式:
只要確保下標都是整數,這些都是合法的。
數組的初始化結構體相似,例如:
float score[60] = {68.0, 84.2, };
如果定義數組同時初始化它,可以不指定數組長度,例如:
float score[] = {68.0, 84.2, 77.7};
這時,編譯器會根據初始化信息確定 score 數組的長度為 3。不過,結構體可以互相賦值,數組卻不能互相賦值:
既然數組不能互相賦值,也就不能用數組類型作為函數的返回值。這部分內容,可能需要討論到指針,鑒于題主才學到數組,就不展開討論了。
好了,說了這么多,來看一個實例吧,我們使用C語言數組來記錄小明班同學成績,然后找到最高的成績得分:
例子只使用了 6 個成績做演示,原理是通的,編譯并執行上面這段C語言程序,發現找到最高成績了。
使用數組下標不能超出數組的長度范圍,這一點在使用變量做數組下標時尤其要注意。C語言編譯器并不檢查 score[-1] 或是 score[100] 這樣的訪問越界錯誤,編譯時能順利通過,運行時卻會出錯。
有時候這種錯誤很隱蔽,發生訪問越界時程序可能并不會立即崩潰,而執行到后面某個正確的語句時卻有可能突然崩潰。所以,從一開始寫代碼時就要小心避免出問題,事后依靠調試來解決問題的成本是很高的。
理由一,這種錯誤并不總是顯而易見的,如果題主學了指針,就會發現指針指向數組的什么位置只有運行時才知道,編譯時無法檢查是否越界,而運行時檢查數組訪問越界會影響性能,C語言是極其重視效率的編程語言,所以干脆不檢查了;
理由二, C99 Rationale 指出,C語言的設計精神是:相信每個C程序員都是高手,不要阻止程序員去干他們需要干的事,高手們使用count[-1]這種技巧其實并不少見,不能當作錯誤。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
以我的經驗,既然是c語言的數組,那么他肯定要包含很多指針操作。所以我建議先學習計算機原理。搞清楚,計算機如何存儲對象,變量等。棧區,堆區,連續存儲和鏈式存儲。
理解了這些,你就會理解,數組是一段連續存儲空間。每個下標值代表偏移一個單位,也就是地址增加一個數組類型的所占空間大小。
其實,這些原理符合所有語言特性。你必須理解,一個對象或者結構體,就是一段連續的存儲空間,如果程序需要訪問他,就要拿到他的首地址,然后通過偏移去依次訪問其成員。這里的首地址有時是對象指針,有時是數組名稱,有時用取地址符號。
0
回答0
回答0
回答7
回答0
回答1
回答0
回答0
回答0
回答0
回答