讓我們先定義乙個二維陣列
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 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性...