Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,三维数组的兼容不完全指针类型是什么?_C_Pointers_Multidimensional Array_Incomplete Type - Fatal编程技术网

在C语言中,三维数组的兼容不完全指针类型是什么?

在C语言中,三维数组的兼容不完全指针类型是什么?,c,pointers,multidimensional-array,incomplete-type,C,Pointers,Multidimensional Array,Incomplete Type,假设我们有一个二维数组arr,其元素类型为int。然后我们可以定义兼容的不完整指针类型arr:int(*p)[]=arr。但是,如果arr是三维数组,则类似的定义int(*p)[]]=arr不起作用,因为p是指向类型为int[]的数组的指针,在本例中,该类型是不完整的。如何定义三维数组的兼容不完整指针?为最后一个索引指定数组大小,例如int(*p)[[4]对于具有不同常量大小或可变长度数组(VLA)的数组不起作用 此外,我希望在结构中使用此定义。C不支持具有未定义大小的多维数组,您必须为第一维度

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


此外,我希望在结构中使用此定义。

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 > />代码>

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

在C语言中,n>1的n维数组是(n-1)维数组的数组由于数组元素类型必须完整,这意味着多维数组类型的第一个维度最多可以不指定。

正如您所观察到的,您可以在某种程度上通过声明指向不完整数组类型的指针来解决这个问题,但目的是什么呢?您可以使用这些指针做的事情是有限的,因为它们的用途很少,而
void*

却不能很好地满足您的需要:

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

与数组数组的所有场景一样,可以忽略最里面的维度以给出不完整的类型。

即使对于2D,使用
int(*p)[]=arr
,您会如何使用它?您将无法为这两个维度编制索引。或者使用
void*
并在已知时将其转换为最终类型。