以下C ++语句的含义是什么?

时间:2015-03-02 10:46:25

标签: c++ pointers function-pointers

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

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

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

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

通常,由于函数指针,数组指针和类似东西的神秘语法,你应该使用typedef或类型别名(新的using - 语法)来逐步使它更清晰:

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

Proof

此外,您可以考虑返回std::vectorstd::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;

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