[英]2D Array and pointer to a pointer
过去试卷中的问题:
“以下哪一个:
int a[4][4], (*b)[4], *c[4], **d;
你能传递给一个期望指向int的指针的函数吗?
int funct(int **);
解释你的答案。”
答案是c和di相信吗?
我只是在努力理解为什么其余的都不允许呢?
任何帮助,将不胜感激。
funct
需要一个int **
-即指向一个指向int的指针。 d
从字面上是那样,所以没有问题。 c
可以工作,因为它是一个指向int的指针的数组,因此在函数调用上下文中使用时,它会衰减为一个指向int的指针。
a
和b
无效,因为它们不是兼容类型。 a
是一个int数组数组, b
是一个int数组指针。 当作为参数传递时, a
将衰减为int数组指针。
如果可以添加一些有关上述答案之间差异的信息。
声明数组时,此- []
优先级高于此*
。 再加上数组和指针始终可互换(它们不是)的假设,吸引了很多人。
天真地假设int *arr[]
是指向数组的指针,因为从左到右读取是一个自然的假设。
但是,它实际上是一个整数指针数组。 您想要一个指向数组的指针吗? 告诉C:
int (*arr)[array_size];
通过设置自己的优先级。
正如Carl解释的那样,仅答案c
和d
是适用的,因为在d
情况下,您已经有一个指向指针的指针,在c
情况下,当指针数组作为参数传递给函数时,它将衰减为指向指针的指针。
如果您想要一个将读取a
和b
的函数,则签名需要更改为以下内容:
int funct(int (*array_name)[array_size]);
请注意,在上面的内容中,您将需要指定指针将指向的数组的大小。
通常,如果将数组传递给函数,则将其作为指向数组第一个元素的指针传递 ...
将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指针..so fun(int ** p)
fun(c)---> fun(int ** p)
int ** d是指向int的双指针。因此调用fun(d)要求参数必须为fun(int ** p)
fun(d)---> fun(int ** p)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.