Функция указателя принимая аргумент

int (*ptr)(char (*ch)[]);

что означает приведенное выше объявление? Означает ли это

ptr-указатель на функцию, которая принимает аргумент, являющийся массивом указателей на символы, возвращающие целое число?

Как оценить?

4 ответов


есть правило:http://ieng9.ucsd.edu / ~cs30x/rt_lt.rule.html

кратко, вы должны начать с идентификатора, а затем проанализировать все от идентификатора вправо (это может быть () - функции или [] массив), затем проанализируйте все от идентификатора влево. Скобки изменяют этот порядок - вы должны сначала разобрать все в самых внутренних скобках и так далее, это работает как с арифметикой проведенные расчеты.

другими словами, есть приоритет (который может быть изменен скобками), от выше до ниже:

1) () - функции и [] - массив, слева направо;

2) * - указатель, тип, тип модификатора, справа налево.


ваш пример

int (*ptr)(char (*ch)[])

начнем с идентификатором

int (*ptr)(char (*ch)[]);  // (1)ptr
      |_|                      
       1

идентификатор ptr в скобках, поэтому мы разбираем все в parenteses первый

(*ptr)  // (1)ptr
  |_|       
   1

справа ничего нет, поэтому разбираем слева

(*ptr)  // (1)ptr is (2)a pointer
 ||_|       
 2 1

мы закончили в скобках, теперь разберем справа от скобок

int (*ptr)(char (*ch)[]);  // (1)ptr is (2)a pointer to (3)function
     ||_| |____________|
     2 1        3

до сих пор мы игнорируем аргументы функции и разбираем слева от круглых скобок

int (*ptr)(char (*ch)[]);  // (1)ptr is (2)a pointer to (3)function which returns (4)int
|_| ||_| |____________|
 4  2 1        3

In так же, как мы разбираем аргумент функции (я вставил некоторые пробелы для лучшего выравнивания)

char  (* ch )[ ]  // (1)ch is (2)a pointer to (3)array of (4)chars
|___|  | |_| |_|
  4    2  1   3

наконец, мы имеем:

PTR-указатель на функцию, которая возвращает int и принимает указатель на массив символов в качестве аргумента


ptr-указатель на функцию, которая принимает аргумент, который является указателем в массив символов, возвращая целое число.


как вы написали, ptr - это указатель на функцию, которая возвращает int, и принимает в качестве аргумента указатель на массив char.

однако вам не разрешается иметь указатель на массив без привязки к массиву. Таким образом, ваша переменная неправильно указана и не будет компилироваться. Кажется, вы хотите ptr иметь тип, который может принимать указатель на функцию, которая может принимать любой размер массива. Для этого требуется построение шаблона. Для аргумента функции , он имеет вид:

template <unsigned N>
int foo (int (*ptr)(char (*)[N])) {
    //...
}

обычно способ упростить такие типы-использовать typedef для представления сложных частей, так что сама переменная становится простым указателем на некоторый тип. Это особенно полезно при попытке написать функцию, которая возвращает указатель на функцию.

void x (char *s) {}
typedef void xtype (char *);

void (* y_hard ())(char *) { return x; }
xtype * y_easy () { return x; }

однако параметризованный характер аргумента функции затрудняет достижение этого. Предполагая C++ 11, вы можете использовать следующую конструкцию (спасибо этот ответ):

template <unsigned N>
using ArrayArg = const char [N];

template <unsigned N>
using Function = int (ArrayArg<N> *);

template <unsigned N>
int foo (Function<N> *ptr) {
    //...
}

Он работает в GCC.

да ptr - это указатель на функцию. Это указатель на функцию, возвращающую целое число и принимающую указатель на массив символов в качестве аргумента.

рассмотрим функцию fun со следующим прототипом,

int fun(char (*ptr)[]);

fun() - это функция, принимающая указатель на символьный массив в качестве аргумента.

и следующий фрагмент кода компилируется без каких-либо ошибок или предупреждений,

int (*ptr)(char (*ch)[]);
ptr=fun;