如何解决在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];
在所有数组数组的情况下,都可以省略最里面的维以给出不完整的类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。