c++ - int* x[n][m] 和 int (*x) [n][m] 有什么区别?

标签 c++ c pointers

正如我所见,int *x[n][m]x 声明为指向整数的二维指针数组,因此分配内存应为就像 x[i][j] = new int 一样简单,正如预期的那样,它工作正常。现在,如果我将声明更改为:

int (*x)[n][m]

x[i][j] = new int 不再有效并导致编译错误。

x = (int(*)[n][m]) malloc (sizeof(int[n][m])) 然而编译。从我运行的几个测试来看,在内存分配之后,不同的声明/分配组合似乎不会影响存储在变量中的值。我错过了什么吗?所以我的问题是,**int *x[n][m] 和 int (x)[m][n] 之间有区别吗? int (x)[n][m] 是如何存储在内存中的?

最佳答案

int *a[n][m] 是指向 int 的二维指针数组。

int (*p)[n][m] 是指向 int 的二维数组的指针(这是您通过获取地址获得的类型int[n][m]).

在这两种情况下,nm 都需要是编译时常量,否则声明在C++ 中是不合法的(但在C 中)。不过,您的编译器可能有允许它的扩展。

第一个可以用来模拟三维数组。我说模拟,因为它不是一个具有连续存储的适当数组,并且类型首先是不同的。在 a 的每个元素中,您可以将地址存储到整数数组的第一个元素。每个都可以有不同的大小并动态分配。您也可以存储指向单个(可能分配给堆栈的)整数的指针。

int i = 0;
int a1[2] = {};

int* a2[2][2];
a2[0][0] = a1;  // array to pointer decay here
a2[0][1] = new int[42];
a2[1][0] = new int[84];
a2[1][1] = &i;

p 可以指向单个二维数组或其数组:

int arr[2][3];
int (*p1)[2][3] = &arr;  // arr decays to int(*)[3], so we need to take the address
int (*p2)[2][3] = new int[42][2][3]; // allocate 42 arrays dynamically

关于c++ - int* x[n][m] 和 int (*x) [n][m] 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22935024/

相关文章:

c++ - sqllite3_bin_text 的正确用法

c++ - 如何为相同的预处理程序变量编译C++

c++ - 为什么 __int128_t 在 x86-64 GCC 上比 long long 快?

c - C 文件处理中的运行时检查失败 #2

c++ - 关于 C++ 中的指针和数组

c++ - 将指针传递给函数并修改它

c++ - 使用指向 map vector 的指针 (C++)

c - 在 C 中使用 scanf 写一封信

c - 函数指针转换

C++ 指向数组的指针并访问?