声明指向多维数组并分配数组的指针

vin*_*e88 22 c++ pointers multidimensional-array

我试过看,但我找不到任何明确的答案.我知道我的问题不会那么难.也许只是因为我累了..

基本上,我想声明一个指向二维数组的指针.我想这样做,因为最终我将不得不调整数组的大小.我用1D数组成功完成了以下操作:

int* array;
array = new int[somelength];
Run Code Online (Sandbox Code Playgroud)

我想用2D数组执行以下操作但不会编译:

int* array;
array = new int[someheight][somewidth];
Run Code Online (Sandbox Code Playgroud)

编译器给出了一个错误,指出'somewidth'不能出现在常量表达式中.我已经尝试了**和[] []的各种组合,但它们似乎都没有用.我知道这并不复杂......任何帮助都表示赞赏.

Ton*_*ion 44

const int someheight = 3;
 const int somewidth = 5;

 int (*array)[somewidth] = new int[someheight][somewidth];
Run Code Online (Sandbox Code Playgroud)

  • 与此处的其他答案不同,这个答案实际上回答了问题,即如何声明指向多维数组的指针 - 而不是锯齿状数组.这是性能敏感应用程序的重要区别.如果"somewidth"是常量,只有"someheight"发生变化,它才有效.如果你看看这个2D数组是如何在内存中布局的 - 它们是一起连续的,只需要完成单个"新"内存分配.如果宽度也是动态的,亚历山大拉弗蒂的答案也很好.其他答案很慢,因为他们做了大量的mallocs ...... (8认同)

dut*_*utt 13

我刚刚发现这个古老的答案仍然被阅读,这是一个耻辱,因为它是错的.请看下面的答案,而不是所有选票.


阅读指针语法,您需要一个数组数组.这与指针指针是一回事.

int width = 5;
int height = 5;
int** arr = new int*[width];
for(int i = 0; i < width; ++i)
   arr[i] = new int[height];
Run Code Online (Sandbox Code Playgroud)

  • 你试过这个吗?它不编译(如果高度和宽度都是变量) (2认同)
  • 不,数组和指针数组不是一回事.为什么接受这个帖子?Tony The Lion的答案是正确的,这个*完全错误. (2认同)

Aru*_*run 6

使用短语"二维动态数组"进行谷歌搜索几秒后,这里是一个现成的示例:

int **dynamicArray = 0;

// memory allocated for elements of rows. 
dynamicArray = new int *[ROWS];

// memory allocated for  elements of each column.  
for( int i = 0 ; i < ROWS ; i++ ) {
    dynamicArray[i] = new int[COLUMNS];
}

// free the allocated memory 
for( int i = 0 ; i < ROWS ; i++ ) {
    delete [] dynamicArray[i];
}
delete [] dynamicArray;
Run Code Online (Sandbox Code Playgroud)

  • @ArunSaha,这是旧的,但要回答你的问题,对于其他任何偶然发现的问题,二维数组在内存中是连续的; 动态数组的动态数组在第一维中是连续的,但第二维中的每个数组都是分开存储的 (5认同)
  • @Alexander Rafferty:我明白了 - "数组数组"和"2D数组"有什么区别? (3认同)
  • 这是一个数组数组,而不是2D数组. (2认同)

Ale*_*rty 6

我建议使用比数组数组简单得多的方法:

#define WIDTH 3
#define HEIGHT 4

int* array = new int[WIDTH*HEIGHT];
int x=1, y=2, cell;
cell = array[x+WIDTH*y];
Run Code Online (Sandbox Code Playgroud)

我认为这是比数组数组更好的方法,因为分配要少得多。您甚至可以编写一个辅助宏:

#define INDEX(x,y) ((x)+(WIDTH*(y)))

int cell = array[INDEX(2,3)];
Run Code Online (Sandbox Code Playgroud)