哈囉~ 近日逛iT邦幫忙的問答區,
我發現非常多人是不給最佳解答的,
我覺得這樣不是很好,
有些發問者回答的盡心盡力,
應該給予「最佳解答」表達基本的感謝與鼓勵
因此在發問前,
我先保證只要有人回答,
哪怕是回答隻字片語或提供想法,
我一周內一定會給出「最佳解答」
今天我學到了兩種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個記憶體則是連續的位置,
不知道這樣有沒有理解錯的地方?
這兩種宣告方式在使用上有什麼不一樣嗎?
如果有程式碼解說或畫圖解釋者為佳,
謝謝大家
我不知道正確的理論
只好把位址顯示出來比較
就抄這篇來改
看起來答案是「一樣」
第一種
第二種