Определение char (* (* a) ()) []; - PullRequest
0 голосов
/ 25 апреля 2020

У меня проблемы с пониманием 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: предупреждение: назначение из несовместимого указателя type [-Wincompatible-pointer-types]

, который ссылается на a=func

Я знаю, что char (*(*a)()) означает указатель на функцию, которая возвращает указатель на символ, но я не знаю что с ним делает добавление [], то есть char (*(*a)())[];

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Для расшифровки сложных C объявлений вы можете использовать спиральное правило, см. http://c-faq.com/decl/spiral.anderson.html. Существует также инструмент для перевода C деклараций в простой английский Engli sh:

https://cdecl.org/

В общем, лучше разделить сложную декларацию на части и дать им значимые имена, например

#include <stdlib.h>

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

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

    b = a;
    return 0;
}
1 голос
/ 25 апреля 2020

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

- это объявление указателя на функцию, которая возвращает указатель на массив неполного типа 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();

вы можете получить указатель на полный тип массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...