下面的C++语句是什么意思

What does the following C++statement mean

今天在一次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;

有什么想法吗?

fb 是以下签名的函数指针:

  • 该函数有两个参数:intchar*
  • 函数returns指向两个int数组的指针,其类型为int(*)[2]

通常,由于函数指针、数组指针等的隐晦语法,您应该使用 typedef 或类型别名(新的 using-syntax)逐步使其更清晰:

using int2 = int[2];
using int2ptr = int2*;
using fb = int2ptr(int, char*);

Proof

此外,您可以考虑返回 std::vectorstd::array,而不是返回数组;您可以考虑 std::string 而不是传递 char 指针,您可以考虑 std::function 而不是使用函数指针。这些都是"coulds",因为每个"raw type"都有它存在的理由,但理由很有限

我的同事刚刚发来一个回复:

int (*(*fb)(int, char*))[2];

int(*(returnArray(int, char*)))[2]
{
    static int tab[2];
    return &tab;
}

// finally we have it
fb = returnArray;

我不知道谁可以使用它以及用于什么目的

它是一个指向函数指针的定义,它有两个参数,一个是 int 类型,另一个是 char * 类型,returns 指向 [=14] 类型数组的指针=].

这是一个简化的演示程序。我只将第二个参数更改为类型 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