Функция указателя принимая аргумент
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;