int (*ptr)(char (*ch)[]);
上述声明是什么意思?是不是意味着
ptr是指向一个函数的指针,该函数接受一个参数,该参数是指向返回整数的字符的指针数组?
如何评估?
答案 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;