指向int数组的指针数组

Mat*_*hai 1 c multidimensional-array

经过大量的战斗,我在一个像A [2] [3]这样的声明中想出来,A是一个与int(*)[3]兼容的类型.我的理解是A可以用来指向前三个元素,A + 1指向下三个元素.有什么办法可以声明一个指向数组的指针数组.

   ptr_array    

    +----+                  +----+----+----+                        
    |    |        ---->     |    |    |    |
    |    |                  | 24 | 25 | 26 | 
    +----+                  +----+----+----+
    |    |                  | 44 | 45 | 46 |
    |    |         ---->    |    |    |    |
    +----+                  +----+----+----+
 Array of pointers          two dimensional array of three integers   
   to array of 3
Run Code Online (Sandbox Code Playgroud)

我如何声明ptr_array,以便这样做

ptr_array[0] = A;
Run Code Online (Sandbox Code Playgroud)

ptr_array[1] = A + 1;
Run Code Online (Sandbox Code Playgroud)

out*_*tis 5

C中的多维数组是数组的数组.n维阵列的元素是(n-1)维阵列.A[0]例如,是一个int [3].

A:    |24|25|26|44|45|46|
A[0]: |24|25|26|
A[1]: |44|45|46|

在某些上下文中,数组被转换为指向数组的第一个元素的指针,但该数组本身不是指针.

根据C标准,§6.5.2.1-3:

3个连续的下标运算符指定多维数组对象的元素.如果E是维度为i×j×...×k的n维数组(n≥2),则E(用作除左值之外的值)被转换为指向(n-1)维数组的指针尺寸为j×...×k.如果将unary*运算符显式地应用于此指针,或者作为预订的结果隐式应用,则结果是指向的(n-1)维数组,如果用作除左值之外的其他数据本身将被转换为指针.由此得出,数组以行主要顺序存储(最后一个下标变化最快).

4示例考虑声明定义的数组对象

int x[3][5];
Run Code Online (Sandbox Code Playgroud)

这里x是3×5的整数数组; 更准确地说,x是一个由三个元素对象组成的数组,每个元素对象是一个由五个整数组成的数组.在表达式中x[i],相当于(*((x)+(i))),x首先转换为指向初始数组为5个int的指针.然后根据x的类型调整i,这在概念上需要将i乘以指针所指向的对象的大小,即五个int对象的数组.添加结果并应用间接以产生五个整数的数组.当在表达式中使用时x[i][j],该数组又转换为指向第x[i][j]一个int 的指针,因此产生一个int.

创建ptr_array如图所示:

int (*ptr_array[2])[3]
ptr_array[0] = A;
ptr_array[1] = A+1;
// or:
ptr_array[0] = &A[0];
ptr_array[1] = &A[1];
// or even:
ptr_array[0] = (int(*)[3])A[0];
ptr_array[1] = (int(*)[3])A[1];
// though this last shouldn't be used in production code
Run Code Online (Sandbox Code Playgroud)

这是如何制定声明.从图中,ptr_array是一个大小为2的数组.

... ptr_array[2] ...
Run Code Online (Sandbox Code Playgroud)

数组的元素是指针

*ptr_array[2]
Run Code Online (Sandbox Code Playgroud)

到大小为3的数组

(*ptr_array[2])[3]
Run Code Online (Sandbox Code Playgroud)

整数

int (*ptr_array[2])[3]
Run Code Online (Sandbox Code Playgroud)

如果你一直不确定如何声明这样的东西,你可以使用cdecl:

cdecl> declare ptr_array as array 2 of pointer to array 3 of int
int (*ptr_array[2])[3]

您可以在开发计算机上安装命令行版本的cdecl(如果尚未安装).确切的方法取决于平台.检查文档和Web.