-1

我确定qinint q[6][4]是 类型(**q)[4],即pointer to a pointer to an integer array sized 4。但是我有这本书(我觉得它很可疑!!)说int q[][4]函数定义void foo(int q[][4]){}中的部分与int (*q)[4]. 我对这本书很矛盾,但让我提出一些在我脑海中突然出现的问题供您考虑.您的详细解释非常受欢迎。

1) 声明时,in的类型和qinint q[][4]的类型一样int q[6][4]吗?与书上所说的相反,我认为q[][4]什么都不q[0][4]是,我觉得 q 是类型(**q)[4],而不是(*q)[4]。我是对的吗?你对此有何看法?

2) (最令人困惑的一点)我知道传递int *qint q[](或int q[4])在 C 中是相同的,因为后者减少到前者。但我已经从编译器验证了int (*q)[5]与 不同的类型int (*q)[4],那么传递之间有什么区别函数的参数A) int (*q)[] B)int (*q)[4]C)int (*q)[5] ? 请详细回答这部分。

3)传递int q[][4]给函数与传递int q[6][4]C 有何不同?在这两种情况下都q归约到吗?(**q)[4]

4

3 回答 3

7

我确定 q inint q[6][4]的类型为(**q)[4],即指向指向大小为 4 的整数数组的指针

不。(具体来说,指向数组的指针与事实相去甚远。)q是 类型int[6][4],即 4 个整数的 6 个数组的数组。

当传递给函数时,它只是数组的第一个(最内层)维度衰减为指针。所以,int[6][4]衰变为int (*)[4],也是如此int[][4]

int (*q)[5]与 的类型不同,因此作为参数传递给函数 A) B)和 C)int (*q)[4]之间有什么区别int (*q)[]int (*q)[4]int (*q)[5]

A) 是不完整的类型(指向任意大小数组的指针)。您不能取消引用它,也不能对其执行指针运算。

B) 是一个指向 4 ints 数组的指针。C) 是指向 5 ints 数组的指针。

传递int q[][4]给函数与传递int q[6][4]C 有何不同?

从语义上讲,它们的含义相同。它们都衰变为int (*)[4].

(**q)[4]q在这两种情况下都减少到吗?

不,但我已经解释过了。

于 2013-04-28T19:17:15.273 回答
2

对于第一个问题,q是一个由四个整数组成的数组。

您可能想了解顺时针/螺旋规则。它实际上可能会帮助您解决第二个问题。

于 2013-04-28T19:13:09.327 回答
1

1) 声明时,int q[][4]中q的类型和int q[6][4]中的q类型是否相同?

是的。函数声明中不需要第一个维度,函数声明的多维数组具有 type pointer to an array

作为参数传递给函数 A) int (*q)[] B)int (*q)[4] 和 C)int (*q)[5] 有什么区别?

int (*q)[]是一个指向未知大小数组的指针。int (*q)[4]是指向int[4]并且int (*q)[5]是指向的指针int[5]。它们都有不同的类型。

3) 将 int q[][4] 传递给与在 C 中传递 int q[6][4] 不同的函数有何不同?在这两种情况下 q 是否都简化为 (**q)[4]?

它们都等价于int (*q)[4]

请阅读23.1: c.faq 的多维数组和函数以获取更多详细信息。

于 2013-04-28T19:16:56.230 回答