C語言再學習6 多維陣列

2021-08-28 10:53:24 字數 3497 閱讀 5281

讓我們先定義乙個二維陣列

int arr[3][3] = ,	,	

};//3行3列,第乙個3代表了一共有3行,第二個3代表了一行裡一共有多少個資料

int arr[4][5]=,

, , };

//4行5列,以此類推

廢話不多說,先上反彙編

int arr[3][3] = ,

001717c8 c7 45 d8 01 00 00 00 mov dword ptr [arr],1

001717cf c7 45 dc 02 00 00 00 mov dword ptr [ebp-24h],2

001717d6 c7 45 e0 03 00 00 00 mov dword ptr [ebp-20h],3

,001717dd c7 45 e4 04 00 00 00 mov dword ptr [ebp-1ch],4

001717e4 c7 45 e8 05 00 00 00 mov dword ptr [ebp-18h],5

001717eb c7 45 ec 06 00 00 00 mov dword ptr [ebp-14h],6

001717f2 c7 45 f0 07 00 00 00 mov dword ptr [ebp-10h],7

001717f9 c7 45 f4 08 00 00 00 mov dword ptr [ebp-0ch],8

00171800 c7 45 f8 09 00 00 00 mov dword ptr [ebp-8],9

};

讓我們看看昨天的一維陣列-c語言再學習之陣列

驚奇的發現,二維陣列和一位陣列好像一樣?實驗一下

int arr2[9] = ;

009a4db8 c7 45 d8 01 00 00 00 mov dword ptr [arr2],1

009a4dbf c7 45 dc 02 00 00 00 mov dword ptr [ebp-24h],2

009a4dc6 c7 45 e0 03 00 00 00 mov dword ptr [ebp-20h],3

009a4dcd c7 45 e4 04 00 00 00 mov dword ptr [ebp-1ch],4

009a4dd4 c7 45 e8 05 00 00 00 mov dword ptr [ebp-18h],5

009a4ddb c7 45 ec 06 00 00 00 mov dword ptr [ebp-14h],6

009a4de2 c7 45 f0 07 00 00 00 mov dword ptr [ebp-10h],7

009a4de9 c7 45 f4 08 00 00 00 mov dword ptr [ebp-0ch],8

009a4df0 c7 45 f8 09 00 00 00 mov dword ptr [ebp-8],9

讓我們來對比一下堆疊操作

int arr2[3][3] = ;//多維陣列使用一維陣列的方式賦值!
使用多維陣列:

二維陣列的賦值

int arr[3][3] = ;

int arr3[3 * 3] = ;

int arr3[9] = ;

//無論陣列怎麼賦值,在堆疊中的結構永遠不變!否則就不叫陣列了

既然多維陣列可以使用一維陣列的 方式來訪問,而且多維陣列在底層和一維陣列一樣,那麼我們可以不可以使用一維陣列的方式來訪問多維陣列?

先思考一下,如果arr[3][3]我們要訪問arr第四個值,那麼得到的值應該是第二行的第乙個,也就是arr[2][1],如果我們使用arr[4]應該也可以訪問到

猜測一下,arr[2][1]的opcode是

mov         dword ptr [ebp-18h],5  

//那麼我們的arr[2][1]讀取的**就應該是一樣的!

int b = 0;

010b4df7 c7 45 cc 00 00 00 00 mov dword ptr [b],0

b=(int )arr[2][1];

010b4dfe b8 0c 00 00 00 mov eax,0ch

010b4e03 d1 e0 shl eax,1

010b4e05 8d 4c 05 d8 lea ecx,arr[eax]

010b4e09 ba 04 00 00 00 mov edx,4

010b4e0e c1 e2 00 shl edx,0

010b4e11 8b 04 11 mov eax,dword ptr [ecx+edx]

010b4e14 89 45 cc mov dword ptr [b],eax

//通過昨天的練習得知,imul其實就是計算下標而已,使用arr[4]來查詢陣列,

既然編譯器都幫我們使用了arr[4],那我們直接使用arr[4]又能不能讀取arr[2][1]呢?

b = (int)arr[4];

01304e98 b8 0c 00 00 00 mov eax,0ch

01304e9d c1 e0 02 shl eax,2

01304ea0 8d 4c 05 d4 lea ecx,arr[eax]

01304ea4 89 4d c8 mov dword ptr [b],ecx

//分析彙編發現,這裡僅僅是把arr[4]的位址給了b!

再來看看arr[4]是什麼鬼

lea ecx,dword ptr ss:[ebp+eax-2c]

arr[30]....

總結:無論多少維陣列,在記憶體中都是連續排列,可以使用堆疊來訪問陣列的值

c 學習筆記6,陣列,多維陣列

初始化陣列 double balance 5 訪問陣列元素 陣列元素可以通過陣列名稱加索引進行訪問。元素的索引是放在方括號內,跟在陣列名稱的後邊。例如 double salary balance 9 上面的語句將把陣列中第 10 個元素的值賦給 salary 變數。下面的例項使用了上述的三個概念,即...

C語言再學習 函式

一 函式概述 1 首先什麼是函式?函式是用於完成特定任務的程式 的自包含單元。2 為什麼使用函式?第 一 函式的使用可以身故重複 的編寫。第 二 函式使得程式更加模組化,有利於程式的閱讀修改和完善。3 main函式原型 int main int argc,char argv,char envp 第乙...

c語言 再學習筆記

簡單的來說 在區域性變數前加上 static 可以延長他的生命週期 由 函式呼叫時 延長至 程式存活週期 在全域性變數前加上static 可以減小它的作用域 由 多檔案可見,減小到單檔案內 可見 局變數的說明之前再加以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性...