int*x [n] [m]和int(*x)[n] [m]之间有什么区别?

Rak*_*ary 11 c c++ pointers

正如我所看到的那样,它int *x[n][m]声明x是一个指向整数的2-d指针数组,所以分配内存应该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]如何存储在内存中?

jro*_*rok 19

int *a[n][m]是一个二维指针数组int.

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

在这两种情况下,n并且m必须编译时间常数,否则声明不合法的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;
Run Code Online (Sandbox Code Playgroud)

p 可以指向单个2d数组或其数组:

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
Run Code Online (Sandbox Code Playgroud)

  • "(这是int [n] [m]衰变的类型)"正如你在代码中的注释正确指出的那样,`int [n] [m]`不会衰减为`int(*)[n] [ m]` - 它衰变为`int(*)[m]`.`int [o] [n] [m]`将衰减为`int(*)[n] [m]`(数组衰减到指向其第一个元素的指针 - 而不是数组本身). (2认同)