我今天在C ++面试中看到了一个声明:
int (*(*fb)(int, char*))[2];
我不知道这个宣言可能意味着什么。它看起来很像函数指针,但是第一个星形和方形括号会破坏一切。
Visual Studio将fb
的类型解码为int[2] * (int, char *) *
,这看起来有点神秘。
如果我们简化声明而不是一切看起来很清楚
int(*(*fa)(int, char*));
int* func(int, char*)
{
return 0;
}
// now we can assign func to fa
fa = func;
有什么想法吗?
答案 0 :(得分:4)
fb
是以下签名的函数指针:
int
和char*
int
数组的指针,其类型为int(*)[2]
通常,由于函数指针,数组指针和类似东西的神秘语法,你应该使用typedef或类型别名(新的using
- 语法)来逐步使它更清晰:
using int2 = int[2];
using int2ptr = int2*;
using fb = int2ptr(int, char*);
此外,您可以考虑返回std::vector
或std::array
,而不是返回数组;你可以考虑std::string
而不是传递char指针,而不是使用函数指针,你可以考虑std::function
。所有这些都是" cans",因为每个"原始类型"有理由存在,但原因非常有限。
答案 1 :(得分:1)
它是函数指针的定义,它有两个参数,一个是类型int
,另一个是类型char *
,并返回指向int[2]
类型数组的指针。
这是一个简化的示范程序。我只更改了第二个参数以输入const char *
#include <iostream>
int(*f( int x, const char *s ))[2]
{
static int a[2] = { x, *s };
return &a;
}
int main()
{
int (*(*fb)(int, const char*))[2] = f;
auto p = fb( 10, "A" );
std::cout << ( *p )[0] << '\t' << ( char )( *p )[1] << std::endl;
return 0;
}
输出
10 A
答案 2 :(得分:0)
我的同事刚刚发了回答:
int (*(*fb)(int, char*))[2];
int(*(returnArray(int, char*)))[2]
{
static int tab[2];
return &tab;
}
// finally we have it
fb = returnArray;
我不知道谁可以使用它以及用于什么目的