c - "void foo(int q[][4]){}"中的 q 是什么类型?使用 "void foo(int q[6][4]){}"与前者有何不同?

标签 c arrays pointers multidimensional-array

我确定 int q[6][4] 中的 q 的类型为 (**q)[4],即, 指向大小为 4 的整数数组的指针。但是我的书(我发现它很可疑!!)说函数定义中的 int q[][4] 部分 void foo(int q[][4]){ }int (*q)[4] 相同。我对这本书很矛盾,但让我提出一些我脑海中突然出现的问题供您考虑。非常需要您的详细解释。

1) 声明时,int q[][4]q的类型是否与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] 吗?

最佳答案

I am certain q in int q[6][4] is of type (**q)[4], ie, pointer to a pointer to an integer array sized 4

没有。 (具体来说,指向数组的指针与事实相差甚远。)q 的类型为 int[6][4],i 。 e.一个由 6 个数组组成的数组,每个数组有 4 个整数。

当传递给函数时,只有数组的第一个(最内层)维度会衰减为指针。因此,int[6][4] 会衰减转换成 int (*)[4]int[][4] 也是如此。

int (*q)[5] is not the same type as int (*q)[4], so what is the difference between passing as arguments to a function A) int (*q)[] B) int (*q)[4] and C) int (*q)[5]

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

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

How is passing int q[][4] to a function different from passing int q[6][4] in C?

从语义上来说,它们的意思是相同的。它们都衰减为 int (*)[4]

Does q reduce to (**q)[4] in both cases?

不,但我已经解释过了。

关于c - "void foo(int q[][4]){}"中的 q 是什么类型?使用 "void foo(int q[6][4]){}"与前者有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266618/

相关文章:

javascript - 数组拼接不适用于数组格式的字符串(分割字符串)?

java - 二维字符串数组中基于整数的排序

c++ - int* 和 int** 是不同的类型吗? C++

c - _f_data_rom 链接描述文件符号

javascript - 使用 Splice Javascript 在数组中增量添加元素

c++ - 如何在 SQLite 中列出临时表/ View ?

c++ - 在没有内存泄漏的情况下调整指针数组的大小

C:链表困惑

c - C 中的标签类型

c++ - main() 如何处理不带省略号的可变数量的参数?