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

时间:2013-04-28 19:05:45

标签: c arrays pointers multidimensional-array

我确定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 *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]传递给与C中传递int q[6][4]不同的函数?在这两种情况下,q是否会减少为(**q)[4]

3 个答案:

答案 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了解更多详情。