|
|
1
4
我想他的意思是你不能声明这样的数组
在程序中(具有外部或内部链接的声明除外),因为它是一个不完整的类型,数组的大小未知。 但是,您可以将此类声明用作参数声明
因为编译器将参数调整为类型的指针
指针总是完整的类型。 因此,例如,这些函数声明
是等价的,并声明相同的一个函数。 下面是一个使用外部链接声明不完整类型的数组(当声明不是定义时)的示例。
程序输出为
|
|
2
2
普通数组和函数参数数组之间的相似语法是造成大量混淆的原因。 如果声明普通数组,可以这样做:
或者您可以执行以下操作:
这些表单是完全等效的,后者只是告诉编译器计算元素的数量并填写
类似地,您可以使用2D数组来执行此操作,但只能使用最左侧的维度:
这与
所有这些都适用于任何普通的本地或全局数组。值得注意的是,上述方法之所以有效,是因为存在初始值设定项列表。没有初始值设定项列表,我们无法写入
为了产生最大程度的混淆,C还允许将函数参数声明为
因为在具体的函数情况下,数组声明总是被调整(“衰减”)为指向第一个元素的指针。所以
当我们写作时
数组衰减规则适用于任何参数类型。因此,如果使用一个2D数组,它实际上是一个数组数组,它会衰减为第一个元素的指针。它与指向第一个数组的指针相同。所以你可以写
但是这个数组衰减规则并不是“递归地”应用的:C编译器只看到一个数组。它碰巧是一个数组数组,但编译器并不关心。所以我们不能写
|
|
|
Than21 · scala确保块中的隐式转换失败 8 年前 |
|
Dr. Strangelove · C#协方差:具有不同接口特征的类 8 年前 |
|
|
Ash · 使用转换运算符强制转换对象失败 8 年前 |
|
|
Skye MacMaster · 具有隐式类型转换的调用函数 8 年前 |