繁体   English   中英

2D数组和指向指针的指针

[英]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的指针。

ab无效,因为它们不是兼容类型。 a是一个int数组数组, b是一个int数组指针。 当作为参数传递时, a将衰减为int数组指针。

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

声明数组时,此- []优先级高于此* 再加上数组和指针始终可互换(它们不是)的假设,吸引了很多人。

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

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

int (*arr)[array_size];

通过设置自己的优先级。

正如Carl解释的那样,仅答案cd是适用的,因为在d情况下,您已经有一个指向指针的指针,在c情况下,当指针数组作为参数传递给函数时,它将衰减为指向指针的指针。

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

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

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

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

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

  1. 将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指针..so fun(int ** p)
    fun(c)---> fun(int ** p)

  4. int ** d是指向int的双指针。因此调用fun(d)要求参数必须为fun(int ** p)
    fun(d)---> fun(int ** p)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM