Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 - Fatal编程技术网

C语言中的可变修改类型

C语言中的可变修改类型,c,C,有人能解释什么是可变修改类型吗 如果我们有一个数组a[n]并且n在编译时是未知的,那么a就是VLA。给定一个数组b[c][d]其中c和d直到运行时才知道b是VLA,对吗 在我的书中,他们说可变修改类型包含VLA。 就这样,;没别的了 如何创建指向可变修改类型的指针?可变修改类型是VLA(可变长度数组)。在具有灵活数组成员的结构中也有类似的类型,但我不打算进一步讨论灵活数组成员 关于VLA的关键点是数组的维数在运行时之前是未知的。通常,在C89和标准之前,数组的所有维度(除第一个维度外)在编译时都

有人能解释什么是可变修改类型吗

如果我们有一个数组
a[n]
并且
n
在编译时是未知的,那么
a
就是VLA。给定一个数组
b[c][d]
其中
c
d
直到运行时才知道
b
是VLA,对吗

在我的书中,他们说可变修改类型包含VLA。 就这样,;没别的了


如何创建指向可变修改类型的指针?

可变修改类型是VLA(可变长度数组)。在具有灵活数组成员的结构中也有类似的类型,但我不打算进一步讨论灵活数组成员

关于VLA的关键点是数组的维数在运行时之前是未知的。通常,在C89和标准之前,数组的所有维度(除第一个维度外)在编译时都必须是已知的常量值(第一个维度可以指定为
inta[]
intb[][SIZE]
intc[][SIZE1][SIZE2]
,其中大小是常量)

a
b
都是可变长度数组。在C99之前,您不可能编写像这样的
函数();数组的大小必须在编译时作为编译时常量来知道。同样,在C99之前,
另一个函数()
的符号也不合法

您可以,而且仍然可以(出于向后兼容性的原因,如果没有其他原因的话)编写另一个函数()的适度模拟:

这不是一个完美的模拟,因为FIXED_大小是一个固定大小,但是纯C99 VLA代码有一个可变的维度。因此,旧代码通常会使用一个固定的大小,这个大小对于最坏的情况来说是足够大的

other_function()
中,名称
a
b
基本上是指向可变修改类型的指针

否则,执行的操作与固定大小数组相同:

int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;

int v[n];
int (*v_pointer)[n] = &v;

VLA==可变长度数组

C99规范中引入了可变长度阵列,以实现以下功能:

int someArraySize;
int myArray[someArraySize];
可变修改类型是可变长度数组的类型。因此,可变修改类型包含VLA。在b[c][d]的例子中,c和d直到运行时才知道,b是一个可变修改的类型,恰好是一个可变长度的多维数组。b[c][d]是一个可变长度数组的可变长度数组——哎哟,真是太多了

以下是我发现的一个很好的来源,它通过示例描述了这些VLA和可变修改类型:


具有灵活阵列成员的结构不是可变修改类型。定义见N1570 6.7.6p3.OK;我没有检查--修改以匹配您的评论。谢谢
int z[FIXED_SIZE];
int (*z_pointer)[FIXED_SIZE] = &z;

int v[n];
int (*v_pointer)[n] = &v;
int someArraySize;
int myArray[someArraySize];