char (*(*a)())[]; 的定义

The definition of char (*(*a)())[];

我听不懂 char (*(*a)())[]

int main()
{    
    char (*(*a)())[]; // do not change this

    char *x="My endless\n";

    char *  func (){
        return(x);
    }

    a=func;
    return 0;
}

当我编译时,我收到如下警告:
main.c:13:6: 警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]

指的是a=func

我知道 char (*(*a)()) 表示指向函数的指针,该函数 returns 是一个 char 指针,但我不知道添加 [] 对它有什么作用,即 char (*(*a)())[];

这个

char (*(*a)())[];

是指向函数指针的声明,returns指向不完整类型数组的指针char[]

请注意,在另一个函数中定义函数不是标准的 C 功能。

这是一个至少可以编译的演示程序。

#include <stdio.h>

char ( *f() )[]
{
    static char s[][10] =
    {
        "Hello",
        "World"
    };

    return s;
}

int main(void) 
{
    char (*(*a)())[] = f;

    char ( *p )[] = a();

    puts( *p );

    return 0;
}

程序输出为

Hello

在这个程序中使用像这样的转换

char ( *p )[10] = ( char ( * )[10] ) a();

你可以获得一个指向完整数组类型的指针。

要破译复杂的 C 声明,您可以使用螺旋规则,请参阅 http://c-faq.com/decl/spiral.anderson.html。还有一个将 C 声明翻译成简单英语的工具:

https://cdecl.org/

一般来说,一个复杂的声明最好分成几个部分,并给它们起有意义的名字,例如

#include <stdlib.h>

typedef char (*ArrayPointer)[];
typedef ArrayPointer (*Function)();

int main(void)
{
    char (*(*a)())[] = NULL;
    Function b;

    b = a;
    return 0;
}