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