название символа())[]; Является ли этот оператор массивом указателей на функции? - PullRequest
0 голосов
/ 03 марта 2020

Это утверждение заставило меня задуматься. Я в конечном итоге с функцией вывода указателя возвращает массив символов. Но я не могу дать правильное объяснение самому себе.

Ответы [ 5 ]

3 голосов
/ 03 марта 2020

Прочитайте это так (используя правило по часовой стрелке / спирали):

char* (*name())[];

1) Найдите идентификатор.

char* (*name())[];
        ^^^^

"name is a"

2) Move right.

char* (*name())[];
            ^^

"name - это функция, принимающая любой параметр и возвращающая"

3) Больше не может двигаться вправо из-за правой круглой скобки, поэтому двигайтесь влево.

char* (*name())[];
       ^

"name - это функция, принимающая любой параметр и возвращающая указатель на"

4) Can больше не двигайтесь влево из-за левой скобки, так что продолжайте идти направо.

char* (*name())[];
               ^^

"name - это функция, принимающая любой параметр и возвращающая указатель на массив"

5) Больше не может двигаться вправо, потому что у нас нет символов, поэтому go left.

char* (*name())[];
    ^

"name - это функция, принимающая любой параметр и возвращающая указатель на массив указателей на"

6) И, наконец, продолжайте идти влево, потому что на right.

char* (*name())[];
^^^^

"name - это функция, принимающая любой параметр и возвращающая указатель на массив указателей на char".

3 голосов
/ 03 марта 2020

Объявления представляют «картину» того, как что-то будет использоваться. Объявление char* (*name())[]; говорит, что * (*name())[] это char.

  • Тогда (*name())[] это указатель на char.
  • Тогда (*name()) это массив указателей на char.
  • Тогда *name() - это массив указателей на char.
  • Тогда name() - указатель на массив указателей на char.
  • Тогда name - это функция, которая возвращает указатель на массив указателей на char.
1 голос
/ 03 марта 2020

Такие объявления переменных читаются наизнанку, в соответствии с приоритетом оператора .

В этом случае:

  • name - это имя a. ..
  • name() функция (приоритет, оператор () имеет больший приоритет, чем оператор *!), Которая возвращает ...
  • *name() указатель на. ..
  • (*name())[] массив (приоритет, оператор [] имеет более высокий приоритет, чем оператор *!) Из ...
  • *(*name())[] указателей на ...
  • char*(*name())[] символов.

Это в основном эквивалентно методу Эри c Постпищила, но гораздо более ясно показывает, где в игру вступает приоритет оператора.

Кстати: после того, как вы обернетесь вокруг этого объявления переменной, в C не будет объявления переменной, которое вы не сможете понять.

0 голосов
/ 03 марта 2020
char* (*name())[];

С помощью этого оператора вы объявляете функцию с именем name, которая допустимо принимает любой параметр и возвращает указатель на массив указателей на char, а не указатель на функцию, которая возвращает массив char ,

Это объявление или «прототип» функции name.

Обратите внимание, что вам также необходимо определить (что на самом деле делает функция) для функции name в следующем порядке: использовать name в своем исходном коде.

Если вы хотите определить определенный тип конструкции C, вы можете использовать Правило по часовой стрелке / спираль , созданное Дэвидом Андерсоном; но не путать с правилом Андерсона , разработанным Россом Дж. Андерсоном, которое является чем-то совершенно отличным.

0 голосов
/ 03 марта 2020

Нет, это прототип функции. Функция, возвращающая указатель на массив char * указателей. Функция принимает неопределенные параметры

Если вы хотите, чтобы указатель функции возвращал массив указателей на char, он должен быть объявлен следующим образом

 char* ((*name)())[];
...