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

What does the above declaration means? Does it mean

ptr is pointer to a function that accepts an argument which is array of pointers to characters returning integer?

How to evaluate?

4

4 回答 4

4

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

于 2013-06-10T18:25:50.650 回答
3

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

简而言之,您应该从标识符开始,然后解析从标识符到右侧的所有内容(可以是()-函数[] 数组),然后解析从标识符到左侧的所有内容。括号改变了这个顺序 - 你应该首先解析最内层括号中的所有内容,依此类推,它与算术计算一样工作。

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

1) ()-函数[]-数组,从左到右;

2) *-指针类型类型修饰符,从右到左。


你的例子

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

我们从标识符开始

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

标识符ptr在括号中,所以我们首先在括号中解析所有内容

(*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 并接受一个指向字符数组的指针作为参数

于 2013-06-10T19:36:16.117 回答
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,您可以使用以下构造(感谢这个答案):

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

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

template <unsigned N>
int foo (Function<N> *ptr) {
    //...
}
于 2013-06-11T01:06:30.050 回答
1

它在GCC中运行良好。

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

使用以下原型考虑函数 fun,

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

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

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

int (*ptr)(char (*ch)[]);
ptr=fun;
于 2013-06-10T18:25:48.933 回答