2D数组和指针指针

时间:2013-06-27 05:06:24

标签: c pointers multidimensional-array

过去的试卷中的问题:

“以下哪项:

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

你能否传入一个期望指向int指针的函数 即

int funct(int **);

解释你的答案。“

答案是c和d我相信吗?

我只是在努力理解为什么其他人不被允许?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

当声明数组时,此[]的优先级高于此*。结合数组和指针总是可以互换的假设(它们不是)可以吸引很多人。

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

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

int (*arr)[array_size];

设置自己的优先级。

正如Carl所解释的,只有答案cd适用,因为在d情况下你已经有一个指向指针的指针而在c情况下是数组当作为参数传递给函数时,指针会衰减为指针指针。

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

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

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

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

答案 2 :(得分:0)

一般情况下,如果将数组传递给函数,则作为指向数组的第一个元素的指针传递 ...

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

  2. int(* b)[4]是一个指向4个整数数组的指针,所以调用fun(b)需要参数必须很有趣(int(* pt)[])
    有趣(b)---> fun(int(* pt)[])

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

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