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)
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示例考虑声明定义的数组对象
Run Code Online (Sandbox Code Playgroud)int x[3][5];这里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.