这是对的吗?
int (*(*ptr)())[];
我知道这是微不足道的,但我正在看一个关于这种结构的旧测试,这个特殊的组合不是在测试中,它真的让我发疯;我只需要确定一下。这些声明是否有明确而可靠的可理解规则? (即:指向......指向......等......的函数指针的指针) 谢谢!
[R
答案 0 :(得分:14)
The right-left rule 让事情变得简单。
int (*(*ptr)())[];
可以解释为
从变量名称------------------------------- ptr
没有什么是正确的,但是)
所以继续寻找*
-------------- 是一个指针
跳出括号并遇到()
----------- 到一个不带参数的函数(如果是C未指定参数的数量) < / p>
向左走,找到*
-------------------------------------- ---------- 并返回一个指针
跳出括号,右键点击[]
---------- 到的数组
再次左转,找到int
------------------------------------- ints
答案 1 :(得分:6)
在几乎所有想要返回指向数组的指针的情况下,最简单的方法是返回指向数组第一个元素的指针。这个指针可以在与数组名称相同的上下文中使用,它提供的内存不会比返回“指向数组的指针”类型的指针更多或更少,实际上它将保持相同的指针值。
如果你遵循这个,你想要一个指向函数的指针,返回指向int
的指针。你可以构建它(声明的构造比解析更容易)。
指向int
的指针:
int *A;
函数返回指针int
:
int *fn();
指向函数的指针,返回指向int
的指针:
int *(*pfn)();
如果你真的想要返回一个指向函数的指针,该函数返回一个指向int
数组的指针,你可以遵循相同的过程。
int:
的数组int A[];
指向int数组的指针:
int (*p)[];
返回指针的函数......:
int (*fn())[];
指向fn的指针:
int (*(*pfn)())[];
这就是你所拥有的。
答案 2 :(得分:2)
你没有。只需将其拆分为两个typedef:一个用于指向int数组的指针,另一个用于指向函数的指针。类似的东西:
typedef int (*IntArrayPtr_t)[];
typedef IntArrayPtr_t (*GetIntArrayFuncPtr_t)(void);
这不仅更具可读性,还可以更容易地声明/定义您要分配变量的函数:
IntArrayPtr_t GetColumnSums(void)
{ .... }
当然,这假设这是一个现实世界的情况,而不是面试问题或家庭作业。我仍然认为这是一个更好的解决方案,但这只是我。 :)
答案 3 :(得分:1)
如果你想作弊:
typedef int(*PtrToArray)[5];
PtrToArray function();
int i = function;
在gcc上编译产生:invalid conversion from 'int (*(*)())[5]' to 'int'
。第一位是您正在寻找的类型。
当然,一旦你拥有PtrToArray
typedef,整个练习就会变得更加微不足道,但如果你已经拥有了这个功能名称并且你只需要将它粘贴在某个地方,有时这会派上用场。而且,无论出于何种原因,你都不能依靠模板技巧来隐藏你的血腥细节。
如果你的编译器支持它,你也可以这样做:
typedef int(*PtrToArray)[5];
PtrToArray function();
template<typename T> void print(T) {
cout << __PRETTY_FUNCTION__ << endl;
}
print(function);
在我的计算机上,生成void function(T) [with T = int (* (*)())[5]]
能够读取类型非常有用,因为理解编译器错误通常取决于你弄清楚所有这些括号的含义。但是,自己制作它们并不那么有用,IMO。
答案 4 :(得分:0)
这是我的解决方案......
int** (*func)();
Functor返回一个int *数组。它并不像你的解决方案那么复杂。
答案 5 :(得分:0)
使用cdecl,您将获得以下内容
cdecl> declare a as pointer to function returning pointer to array of int;
Warning: Unsupported in C -- 'Pointer to array of unspecified dimension'
(maybe you mean "pointer to object")
int (*(*a)())[]
来自C-faq的This question类似,但提供了3种解决问题的方法。