簡體   English   中英

c ++中2D數組的內存分配

[英]Memory allocation for a 2D array in c++

我是c ++的新手,並試圖理解如何為2D數組完成內存分配。我已經在SOF和這些答案中經歷了幾個線程。

ANSWER1

ANSWER2

這些答案表明,對於2D陣列以及普通陣列,連續的內存分配也會發生。 (糾正我,如果我錯了)答案2提到它應該能夠使用*(array + (i * ROW_SIZE) + j)訪問array[i][j] th元素

但是,當我試圖這樣做時,它給了我一個意想不到的結果。

碼:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int array[2][2] = { {1, 2}, {3, 4} };
    cout<<*((array+1*2) + 1)<<endl;  
    cout<<**((array+1*2) + 1)<<endl;  
    return 0;
}

結果:

0x76e1f4799008
2012576581

它沒有給我array[i][j]元素。 有人可以解釋這里發生的事情,這個解決方案是錯誤的還是我誤解了以前的答案。

它更像是將2d數組模擬為像這樣的一維數組

0 1 2
3 4 5
6 7 8

並且數組將為0 1 2 3 4 5 6 7 8訪問4它應該是*(a [0] +(1 * 3)+1)a [0]與a(數組名稱)相同。

首先,您必須獲得指向整個事物的第一個元素的指針,即不僅僅是第一行:

int *p = &array[0][0]

之后,你可以像你想的那樣索引p

std::cout << *(p + 1*2 + 1) << std::endl;

您的初始嘗試不起作用的原因與類型有關。 發生的事情是,在您第一次嘗試時,您正在嘗試評估

*(array + 1*2 + 1)

既然如此, array的類型為“array-of-length-2”,包含“array-of-length-2”,包含int s,即(int[2])[2]這將做的是增量array 3次它的元素的大小,又是int[2] 這會跳到你的陣列之外。 實際上*(array+3)相當於array[3] 現在,這顯然是int[2]類型的東西,當你嘗試打印它時會衰減到指針。 在你的第二次嘗試中,你取消引用它,產生像array[3][0]這樣的東西,它現在是正確的類型,但同樣,在數組之外的點。

數組是2D指針

**array = array[0][0]
*(*array + j) = array[0][j]
*(*(array+i) + j) = array[i][j]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM