在C中,什么是3维数组的兼容不完整指针类型?

问题描述

假设我们有一个二维数组arr,其元素类型为int。然后,我们可以定义兼容的arr的不完整指针类型:int (*p)[] = arr。但是,如果arr是3维数组,则类似的定义int (*p)[][] = arr不起作用,因为p是指向类型为int []的数组的指针,这是不完整的在这种情况下键入。如何定义3维数组的兼容不完整指针?为最后一个索引(例如int (*p)[][4])指定数组大小不适用于常量大小不同或可变长度数组(VLA)的数组。

此外,我想在struct中使用此定义。

解决方法

您可以使用未指定数量的元素(您的int[])来定义数组类型,但是它们是不完整的类型。您不能使用此类声明对象。您可以声明指向不完整类型的指针(您的int (*)[]void *);这些是完整的类型,但是您不能取消引用它们或对其执行指针算术。但是,您不能定义元素类型不完整的数组类型。这超出了C的数据类型模型。

在C中,具有 n > 1的 n 维数组是( n -1)维数组。 由于数组元素类型必须完整,因此最多不能指定多维数组类型的第一维。

如您所见,您可以在某种程度上通过声明指向不完整数组类型的指针来解决该问题,但是目的是什么?此类指针可以做的事情受到限制,在某种程度上,void *不能很好地使用它们。

,

C不支持具有未定义大小的多维数组,您必须显式定义第一维和第二维的数组大小,或者使用像这样的一维数组:

int height = 3,width = 4,depth = 5;
int arr[height * width * depth];

int x = 1,y = 2,z = 3;
arr[ x + y * height + z * height * width ] = 15;

或切换到C ++并使用std::vector< std::vector< std::vector<int> > >

,

您可以拥有:

int a[3][4][5];
int (*p)[][4][5] = &a;
int (*q)[][5] = a;
int (*r)[] = a[0];

在所有数组数组的情况下,都可以省略最里面的维以给出不完整的类型。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...