在上一期的內容中,為諸君講解到了一維數組,在一維數組的基礎上,C語言中還有著多維數組,其中,比較典型且運用較為廣泛的就是我們今天的主角——二維數組
一 . 二維數組的概念
我們把單個或者多個元素組成的數組定義為一維數組。由此推演,我們可得:把一維數組作為數組的元素,這就是我們的二維數組;把二維數組作為數組的元素,這就是我們的三維數組......
(二維數組以上的數組我們就將其稱為多維數組)
二 . 二維數組的創建
二維數組相較于一維數組,在表達形式上其實沒有太大的變化,多了一個括號而已嘛,其實質也就是多了一個縱列,話不多說,咱們直接上圖理解:
三 . 二維數組的初始化
初始化這個概念,跟諸君都是老朋友了昂,我們每當介紹到一個變量的時候,都會講到其初始化,所以,二維數組也不例外,二維數組的初始化格式跟一維數組相差無幾,只是略有差異而已
(1)二維數組的完全初始化
關于二維數組可以省略“ 行 ”但不能省略“ 列 ”:諸君都是聰明人,大家在腦袋里面推演一下就能相同了,當我們拿到一串數字,雖然我們不知道它有幾行,但我們知道了“ 列 ”數,我們自然是可以大致的將二維數組的表格羅列出來;但我們只知道“ 行 ”,不知道“ 列 ”卻辦不到
這種完全初始化的二維數組在其內部的表現形式為:
(2)二維數組的不完全初始化
這兩個二維數組在其內部的表現形式為:
(3)按照“ 行 ”初始化
?這種按照“ 行 ”初始化的二維數組在其內部的表現形式為:
四 . 二維數組的下標
二維數組跟一維數組的下標格式一樣,如上圖所示,僅僅只是多了個縱列而已,由上至下是從0開始的遞增變化,大家可以簡單地將其理解為我們數學當中的坐標,只是這個特殊的坐標是從左上角開始,數值是由0開始
如上圖,當我們想要找到三行二列的存放的數時,我們只需要輸出 arr [2] [1] 即可,當然,由于這是一個整形數組,我們存放的也是整數,所以我們依舊用“ %d ”打印,如:
五 . 二維數組的輸入與輸出
這幾個字看似陌生,其實都是天天打交道的老朋友啦,你不信?那我就來為諸君逐字分析:
提到輸入,諸君是不是應該第一時間想到 scanf 函數
提到輸出,諸君是不是應該第一時間想到 printf?函數
這就只剩下了我們的二維數組了,且我們的二維數組是不是有多個元素?這就需要我們去“ 遍歷 ”的輸入與輸出,遍歷這個詞兒大家能get到吧?大家可以理解為通過循環的方式一個一個去接觸,所以我們會選擇用 for 循環去遍歷輸入與輸出每個元素
這樣子看來,二維數組的輸入與輸出是不是諸君最熟悉的陌生人呢?
那么話不多說,咱們就直接上圖了昂:
六 . 二維數組在內存中的儲存
大聲的告訴我,我們想要探究一個東西在計算機的內存中的儲存方式,我們該怎么做?
打印地址嘛,地址一打印出來,一瞧,這不比看干巴巴的文字有用,上圖!
(1)這是x64環境下,也就是64位
(2)這是x86環境下,也就是32位
之前提到過,計算機中地址都是以十六進制數儲存的
所以由此觀之:不管是在x64還是在x86環境下,只要是整型,每個地址之間都相差4個字節。且我們也可以得出,二維數組中的每個元素也是連續存放的
七 . 變長數組
在C99標準之前,C語言在創建數組的時候,數組大小的指定只能使用常量、常量表達式。這樣的語法限制呢,就讓人在寫代碼的時候很不方便,使得我們創建數組不夠靈活,數組大了浪費空間,數組小了又會越界,造成bug,很不爽對吧
當然了,這些小問題,諸君不必多慮昂,有限制就必定有突破嘛,在C99當中就改革創新了,給了我們一個變長數組(variable-length array,簡稱 VLA)的新特性,這就使得我們可以運用變量來創建數組,如下圖所示的形式:
變長數組的長度取決于變量 “ n ”的值,編譯器沒辦法事先預知,只有當我們的程序在運行時,才能知道這個“ n ”是多少,我們才能確定數組長度。因此,變長數組是不能初始化的。這個點應該很好理解昂,大家想一想嘛,初始化不就是為了給數組提供元素數據嘛,你這一輸入,數組里的長度不就定死了嘛,那還咋變長啊是吧
但是呢,很遺憾昂,在我們使用的VS2022版本上,雖然支持絕大部分的C99語法,但恰巧就沒有
這個變長數組。當然,有gcc編譯器的小伙伴們可以去試一試,我就不試了,我只有VS2022,大
家了解到這個變長數組的概念就好?
OKK,有關數組的知識點這是這兩期的內容了,一維數組、二維數組、變長數組等等。數組的內容還是很重要的,因為它跟我們C語言中的一大攔路虎——指針,也就是我們俗稱的“ 地址 ”息息相關,所以還望諸君一定引起重視。鄙人這兩天就被指針搞得焦頭爛額,唉,難搞喲,革命尚未成功,同志仍需努力!多的不嘮了,加油加油,咱們也下期再見,與諸君共勉!!!?