我确定q
中的int 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)在声明过程中,q
中的int q[][4]
类型与int q[6][4]
中的类型相同吗?与本书所说的相反,我认为q[][4]
只是q[0][4]
,我觉得q的类型为(**q)[4]
,而不是(*q)[4]
。我是对的吗?你有什么看法?在它上面?
2) (最令人困惑的一点)我知道传递int *q
和int 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]
传递给与C中传递int q[6][4]
不同的函数?在这两种情况下,q
是否会减少为(**q)[4]
?
答案 0 :(得分:7)
我确定
int q[6][4]
中的q类型为(**q)[4]
,即指向指向整数数组大小为4的指针
没有。 (具体指向指向数组的指针非常非常远。)q
的类型为int[6][4]
,i。即一个包含4个4个整数数组的数组。
当传递给函数时,它只是数组中衰变为指针的第一个(最里面的)维度。因此,int[6][4]
衰变为int (*)[4]
},int[][4]
也是如此。
int (*q)[5]
与int (*q)[4]
的类型不同,因此作为参数传递给函数A)int (*q)[]
B)int (*q)[4]
和C){之间的区别是什么? {1}}
A)是一个不完整的类型(指向任何大小的数组的指针)。你不能取消引用它,也不能对它进行指针运算。
B)是一个指向4 int (*q)[5]
s数组的指针。 C)是一个指向5 int
s。
如何将
int
传递给函数与在C中传递int q[][4]
不同?
从语义上讲,它们的意思相同。它们都会衰变为int q[6][4]
。
在两种情况下,q是否会减少到
int (*)[4]
?
不,但我已经解释过了。
答案 1 :(得分:2)
对于第一个问题,q
是一个由四个整数组成的数组。
您可能想了解Clockwise/Spiral Rule。它实际上可能会帮助你解决第二个问题。
答案 2 :(得分:1)
1)在声明期间,int q [] [4]中的q的类型与in中的相同 int q [6] [4]?
是。函数声明中不需要第一个维度,函数声明中的多维数组 的类型为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]传递给与传递int不同的函数 q [6] [4]在C?在两种情况下q是否减少到(** q)[4]?
它们都等同于int (*q)[4]
。
请阅读c.faq的23.1: Multidimensional Arrays and Functions了解更多详情。