[英]Memory allocation for a 2D array in c++
我是c ++的新手,並試圖理解如何為2D數組完成內存分配。我已經在SOF和這些答案中經歷了幾個線程。
這些答案表明,對於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.