过去试卷中的问题:
“以下哪一个:
int a[4][4], (*b)[4], *c[4], **d;
你能传入一个函数,期望指向一个指向 int 的指针吗?
int funct(int **);
解释你的答案。”
答案是c和di相信吗?
我只是在努力理解为什么不允许其余的?
任何帮助,将不胜感激。
过去试卷中的问题:
“以下哪一个:
int a[4][4], (*b)[4], *c[4], **d;
你能传入一个函数,期望指向一个指向 int 的指针吗?
int funct(int **);
解释你的答案。”
答案是c和di相信吗?
我只是在努力理解为什么不允许其余的?
任何帮助,将不胜感激。
funct
期望一个int **
- 即一个指向一个指针到一个整数的指针。 d
字面意思就是这样,所以没问题。 c
也可以工作,因为它是一个指向 int 的指针数组,因此当在函数调用上下文中使用时,它会衰减为指向 int 的指针。
a
并且b
不起作用,因为它们不是兼容的类型。 a
是一个整数数组数组,并且b
是一个指向整数数组的指针。 a
当作为参数传递时,将衰减为指向 int 数组的指针。
通常,如果将数组传递给函数,它将作为指向数组第一个元素的指针传递...
int a[4][4] 到一个函数,即 fun(a);它作为 int (*p)[4] 传递,所以 fun 参数必须是 fun(int (*p)[])
这里第一个元素本身是 4 个整数的数组
fun(a) ---> fun(int (* p)[])
int (*b)[4] 是一个指向 4 个整数数组的指针,因此调用 fun(b) 要求参数必须是 fun(int (*pt)[])
fun(b) ---> fun(int (*pt )[])
int *c[4] 是一个由 4 个整数指针组成的数组。所以调用 fun(c) 需要参数必须是指向数组第一个元素的指针。这里第一个元素本身就是一个 int 指针。所以 fun(int **p)
fun(c) ---> fun(int **p)
int **d 是指向 int..so 的双指针。所以调用 fun(d) 需要参数必须是 fun(int **p)
fun(d) ---> fun(int **p)
如果我可以添加一些关于上述答案之间差异的信息。
this -在声明数组时[]
具有比 this 更高的优先级。*
再加上数组和指针总是可互换的(它们不是)的假设,这让很多人感到困惑。
天真地假设这int *arr[]
将是一个指向数组的指针,因为从左到右读取这是一个自然的假设。
然而,它实际上是一个整数指针数组。你想要一个指向数组的指针吗?告诉 C:
int (*arr)[array_size];
通过设置自己的优先级。
正如卡尔只解释了答案c
并且d
适用,因为在这种d
情况下,您已经有一个指向指针的指针,并且在这种c
情况下,当作为参数传递给函数时,指针数组将衰减为指向指针的指针。
a
如果您想要一个读取and的函数,b
则签名需要更改为以下内容:
int funct(int (*array_name)[array_size]);
请注意,在上面的此处,您需要指定指针将指向的数组的大小。