1

过去试卷中的问题:

“以下哪一个:

int a[4][4], (*b)[4], *c[4], **d;

你能传入一个函数,期望指向一个指向 int 的指针吗?

int funct(int **);

解释你的答案。”

答案是c和di相信吗?

我只是在努力理解为什么不允许其余的?

任何帮助,将不胜感激。

4

3 回答 3

1

funct期望一个int **- 即一个指向一个指针到一个整数的指针。 d字面意思就是这样,所以没问题。 c也可以工作,因为它是一个指向 int 的指针数组,因此当在函数调用上下文中使用时,它会衰减为指向 int 的指针。

a并且b不起作用,因为它们不是兼容的类型。 a是一个整数数组数组,并且b是一个指向整数数组的指针。 a当作为参数传递时,将衰减为指向 int 数组的指针。

于 2013-06-27T05:12:35.803 回答
0

通常,如果将数组传递给函数,它将作为指向数组第一个元素的指针传递...

  1. int a[4][4] 到一个函数,即 fun(a);它作为 int (*p)[4] 传递,所以 fun 参数必须是 fun(int (*p)[])
    这里第一个元素本身是 4 个整数的数组
    fun(a) ---> fun(int (* p)[])

  2. int (*b)[4] 是一个指向 4 个整数数组的指针,因此调用 fun(b) 要求参数必须是 fun(int (*pt)[])
    fun(b) ---> fun(int (*pt )[])

  3. int *c[4] 是一个由 4 个整数指针组成的数组。所以调用 fun(c) 需要参数必须是指向数组第一个元素的指针。这里第一个元素本身就是一个 int 指针。所以 fun(int **p)
    fun(c) ---> fun(int **p)

  4. int **d 是指向 int..so 的双指针。所以调用 fun(d) 需要参数必须是 fun(int **p)
    fun(d) ---> fun(int **p)

于 2013-06-27T05:38:15.137 回答
0

如果我可以添加一些关于上述答案之间差异的信息。

this -在声明数组时[]具有比 this 更高的优先级。*再加上数组和指针总是可互换的(它们不是)的假设,这让很多人感到困惑。

天真地假设这int *arr[]将是一个指向数组的指针,因为从左到右读取这是一个自然的假设。

然而,它实际上是一个整数指针数组。你想要一个指向数组的指针吗?告诉 C:

int (*arr)[array_size];

通过设置自己的优先级。

正如卡尔只解释了答案c并且d适用,因为在这种d情况下,您已经有一个指向指针的指针,并且在这种c情况下,当作为参数传递给函数时,指针数组将衰减为指向指针的指针。

a如果您想要一个读取and的函数,b则签名需要更改为以下内容:

int funct(int (*array_name)[array_size]); 

请注意,在上面的此处,您需要指定指针将指向的数组的大小。

关于二维数组和指向此处此处的指针的一些好的答案。

于 2013-06-27T05:28:48.217 回答