今天我學到了兩種c++語言宣告m列n行陣列的方式,
第一種為:
int ** arr = new int*[m];
for (int i = 0; i < m; i++) {
arr[i] = new int[n];
}
第二種為:
int ** arr = new int*[m];
*arr = new int[m * n];
for (int i = 1; i < m; i++) {
*(arr+i) = *(arr+i-1)+n;
}
實際寫程式實測,兩種都可以宣告出一個m*n大小的二維陣列,
也都可以用arr[i][j]
來取得第i列第j行的元素值,
例如第一種:
#include <iostream>
using namespace std;
int main()
{
int m =5, n = 6;
int ** arr = new int*[m];
for (int i = 0; i < m; i++) {
arr[i] = new int[n];
}
//將二維陣列給予初始值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = i+j;
}
}
//印出二維陣列的所有元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
第二種:
#include <iostream>
using namespace std;
int main()
{
int m =5, n = 6;
int ** arr = new int*[m];
*arr = new int[m * n];
for (int i = 1; i < m; i++) {
*(arr+i) = *(arr+i-1)+n;
}
//將二維陣列給予初始值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = i+j;
}
}
//印出二維陣列的所有元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
看起來兩種宣告方式的使用方式都是非常雷同的,
我想問這兩種方式的記憶體配置差別在哪裡?
我的想法是第一種方法的m列記憶體,每列的n個記憶體位置在不同列之間是不連續的,
而第二種方法的m*n個記憶體則是連續的位置,
不知道這樣有沒有理解錯的地方?
這兩種宣告方式在使用上有什麼不一樣嗎?
如果有程式碼解說或畫圖解釋者為佳,
謝謝大家
我不知道正確的理論
只好把位址顯示出來比較
就抄這篇來改
看起來答案是「一樣」
第一種
第二種
對耶~ 直接把位址印出來看就可以驗證了,
非常簡單又實用的方法,
一時沒想到,哈哈~
但其實第一、二種的記憶體配置是不一樣的,
你仔細看的話,
第一種的arr[0][5]
和arr[1][0]
不是連續的位置(地址差超過4個bytes),
但第二種的arr[0][5]
和arr[1][0]
是連續的位置(地址恰好差4個bytes)。
第一種的arr[0][5]和arr[1][0]不是連續的位置(地址差超過4個bytes),
但第二種的arr[0][5]和arr[1][0]是連續的位置(地址恰好差4個bytes)。
我看到一堆 0,4,8,c,0,4...就眼花撩亂
以為都一樣了