函数指针接受参数

时间:2013-06-10 18:18:51

标签: c++ function pointers function-pointers

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

上述声明是什么意思?是不是意味着

ptr是指向一个函数的指针,该函数接受一个参数,该参数是指向返回整数的字符的指针数组?

如何评估?

4 个答案:

答案 0 :(得分:4)

ptr是指向一个函数的指针,该函数接受一个参数,该参数是一个字符数组的指针,返回整数。

答案 1 :(得分:3)

有规则:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html

简单地说,你应该从标识符开始,然后解析从标识符到右边的所有内容(它可以是() - function [] array ),然后解析从标识符到左边的所有内容。括号改变了这个顺序 - 你应该首先解析最内部括号中的所有内容,依此类推,它就像算术计算一样。

换句话说,有一个优先顺序(可以用括号改变),从高到低:

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

以同样的方式我们解析函数的参数(我插入了一些空格以便更好地对齐)

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

最后,我们有:

ptr是一个指向函数的指针,它返回int并接受一个指向char数组的指针作为参数

答案 2 :(得分:2)

正如您所写,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,您可以使用以下构造(thanks to this answer):

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

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

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

答案 3 :(得分:1)

GCC 中工作正常。

ptr是一个函数指针。它是一个指向函数的指针,该函数返回一个整数并接受一个指向字符数组的指针作为参数。

使用以下原型来考虑函数的乐趣,

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

fun()是一个接受指向字符数组作为参数的指针的函数。

并且下面的代码编译没有任何错误或警告,

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