iT邦幫忙

3

c++兩種不同宣告m*n陣列的方法,記憶體配置差別在哪裡? #保證給最佳解答

c++

哈囉~ 近日逛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個記憶體則是連續的位置,
不知道這樣有沒有理解錯的地方?
這兩種宣告方式在使用上有什麼不一樣嗎?

如果有程式碼解說或畫圖解釋者為佳,
謝謝大家

1 個回答

4
海綿寶寶
iT邦大神 1 級 ‧ 2020-05-11 23:03:30
最佳解答

我不知道正確的理論
只好把位址顯示出來比較
就抄這篇來改
看起來答案是「一樣」

第一種
https://ithelp.ithome.com.tw/upload/images/20200511/200017872TrVgT4DDJ.png
第二種
https://ithelp.ithome.com.tw/upload/images/20200511/200017877BwGxXul3P.png

心原一馬 iT邦研究生 5 級 ‧ 2020-05-11 23:30:26 檢舉

對耶~ 直接把位址印出來看就可以驗證了,
非常簡單又實用的方法,
一時沒想到,哈哈~
/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

但其實第一、二種的記憶體配置是不一樣的,
你仔細看的話,
第一種的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...就眼花撩亂
以為都一樣了
/images/emoticon/emoticon25.gif

我要發表回答

立即登入回答