-
1 # AngryRED
-
2 # 小研己
從應用的角度看二維陣列,很簡單,就是個矩陣。
從儲存的角度看,更簡單,就是一排連續記憶體。
從實現的角度看,確定型別後,不論是按名訪問,指標訪問還是引用訪問,都是由編譯器透過計算找到記憶體地址,然後傳遞。
-
3 # 和博-明
從資料邏輯結構來看,可將二維陣列當成矩陣,其下標就是矩陣的元素下標,只不過行列編號從0開始。
從物理儲存結構來看,二維陣列也就是線上性記憶體空間中分配的一整塊連續記憶體空間(其實不管是幾維陣列,都是一整塊連續空間)。為實現陣列下標與物理記憶體地址直接的對映,首先,需要預先知道記憶體塊的起始地址,C語言中的陣列名即為此起始地址;其次,陣列型別其實表明每個陣列元素佔用的記憶體位元組數。有此兩者,再結合陣列元素的下標(代表著元素在陣列中的位置),即可計算出每個陣列元素的記憶體地址,進而可實現每個陣列元素的讀寫訪問操作。
這裡關鍵是要理解C語言指標和記憶體地址的關係。
-
4 # IT劉小虎
相信題主應該明白 C 語言中基本資料型別的變數,例如定義一個 float 型變數:
float a = 3.14;變數 a 能表示一個數值,但是現實生活中,僅僅使用一個單數值常常是不能完成任務的。更多情況下,需要解決的問題資料型別都是比較複雜的。
一維陣列小明班級有 40 名同學,現在考試成績出來了,要求我們使用 C 語言把它們的成績從高到低排出來。要用 C 語言解決這個問題,首先要用 C 語言把 40 名同學的成績表示出來。但是總不可能定義 40 個變數來儲存各位同學的成績吧?
好在 C 語言提供了陣列語法,我們定義一個 score 陣列用於解決這個問題是非常合適的:
float score[40];score 有 40 個元素,可以表示 40 個同學的成績。C 語言在記憶體中開闢一塊連續的記憶體,供 score 使用,這塊記憶體的大小等於 40*sizeof(float) 位元組。
二維陣列要是現實生活中,所有問題都這麼簡單就好了,那我只要利用 C 語言的一維陣列,就能走遍天下都不怕了。但是事與願違,哪怕只是一個 9 宮格,一維陣列已經不方便描述它了。
難道要定義 3 個一維陣列來描述這個 9 宮格?就算可以,要是這個表再大點呢?比如 1000行,1000列呢?更進一步的,要是希望我們使用 C 語言描述笛卡爾二維座標系,使用一維陣列豈不是麻煩死了?
二維座標系裡的座標怎樣表示方便呢?數學中的表示方法就不錯,橫座標為 a,縱座標為 b 的點,寫作(a, b)。
為了表述方便,使用 P 表示 9 宮格。如果在 P 中畫上座標軸,那每個格子描述起來就方便了,P(0,0) = 0, P(0,1) = 1,...
那要是 C 語言也能這麼用,表示9宮格就太方便了,對不?實際上,還真可以。請看:
float pos[9][9];pos[0][0]=0;pos[0][1]=1;幾乎與用座標描述一模一樣,這可比用一維陣列描述方便多了。類似的,三維陣列,四維陣列,都有適合使用它們的時候,理解方法也同二維陣列相似。
二維陣列的記憶體分配對於人類來說方便的,死板的計算機不一定也這麼認為。實際上,C 語言希望“規則”越少越好,它不怕麻煩,就怕“靈活”。
C語言對記憶體的分配方式,可不會隨著人類認為的“維度”變化而變化。它就一種分配記憶體的方式,不管你是幾維陣列,分配記憶體統一按照線性劃分。
對於 P[1][2],C語言會將其解釋為 P[1*3+2]。計算機最恨的就是“動腦”了,能用一維解決,就絕對不用二維。
而我們人類,最喜歡的就是,怎樣方便怎樣來。這也算是人與機器的區別吧。
-
5 # C語言答疑課堂
C語言二維陣列是C語言語法中一個很重要的概念,也是一個比較難以理解的點。二維陣列之所以不好理解是因為它是一個數組的陣列,從名字上來看就會讓人心生畏懼;再從頭腦理解的角度來看,需要在腦海中構建出C語言陣列的陣列的形象畫面,這很抽象也很吃力。不過二維陣列真沒那麼可怕,希望我下面的講解會讓你發自內心的感慨:原來C語言二維陣列這麼簡單!
在說C語言二維陣列之前,我們先說說一維陣列。
一、C語言一維陣列我定義一個C語言中的一維陣列,如下:
int array_one[3] = {1,2,3};
英文單詞”array“的中文意思是”陣列“,我就用它來表示這個陣列的名字。這個陣列有三個元素,分別是1,2,3,這個大家都很好理解了。之所以這個C語言陣列叫”一維陣列“,是因為array_one陣列的元素已經是最小的實體了,不可再拆開了。你說數字1,2,3你咋拆開,對不對?所以C語言一維陣列核心概念在於一個關鍵詞:不可”拆開“。下面說到C語言二維陣列時,會用”拆開“這個關鍵詞來解釋。
二、C語言二維陣列下面我再定義一個C語言中的二維陣列,如下:
int array_two[2][3] = { {1,2,3}, {4,5,6} };
這種寫法表示array是一個二維陣列,它包含兩個元素,每個元素又是一個數組。看到這你是不是有點犯暈了?沒關係,我們慢慢剖析。
1、C語言二維陣列與一維陣列寫法的比較
從一維陣列與二維陣列的寫法上來看,有兩個不同點:
第一個區別:
array_one[];
array_two[][];
一維陣列後面緊跟一個方括號,而二維陣列後面會有兩個方括號;
第二個區別:
{1,2,3};
{ {1,2,3}, {4,5,6} };
在元素賦值方面,一維陣列使用了一個花括號,二維陣列在使用了一個花括號的同時在裡面又有兩個小花括號。
寫法上就這兩個區別,你也不用去鑽牛角尖為什麼二維陣列要有兩個方括號、花括號裡為啥又嵌入了花括號,你只要記住二維陣列就是這麼寫的就行了。重點是下面:
2、C語言二維陣列與一維陣列含義的比較
一維陣列array_one之所以叫一維陣列,是因為它的元素1,2,3是不可再拆開的東東。
二維陣列array_two之所以叫二維陣列,是因為它的元素是可以繼續拆開的。你可以把C語言二維陣列array_two看成以下形式:array_two[2][3]={array_two[0], array_two[1]}。它的第一個元素是array_two[0],第二個元素是array_two[1]。其中:
第一個元素array_two[0]又可以拆開為{1,2,3},你可以看成array_two[0] = {1,2,3};
第二個元素array_two[1]又可以拆開為{4,5,6},你可以看成array_two[1] = {4,5,6};
換句話說, C語言二維陣列array_two的元素是array_two[0]和array_two[1],它們各自是可以繼續拆開的,這就是二維陣列的所謂”二維“的核心含義。
所以啊,你使用”拆開“這個關鍵詞來理解C語言二維陣列和一維陣列就很好理解,就是一個的元素不可拆開,一個的元素還可以繼續拆開嘛!所以,這次你理解了嗎?
-
6 # C語言學習探討
https://m.toutiaocdn.cn/item/6671941067069194759/?app=news_article×tamp=1555083609&req_id=20190412234009010017042207218361D&group_id=6671941067069194759
可以看看我這片文章
回覆列表
二維陣列,就是將一維數組裡的每一個元素都設定為一個數組。
數學裡的二維矩陣就是二維陣列,更通俗點,如excel中的表格,很多行就表示外面的一維陣列,而某一行有好多列,這些列就表示二維陣列中的值。