这是代码:
char *(*strcpy_ptr)(char *dst, const char *src); Pointer to strcpy-like function
tutorial说:
请注意上述声明中* strcpy_ptr的括号。 这些分隔星号表示返回类型(char *) 星号表示变量的指针级别(* strcpy_ptr - 一级,指向函数的指针。)
我迷失了 - “函数指针”在哪里,“指针级别”是什么?
答案 0 :(得分:2)
您正在声明变量strcpy_ptr
。您希望此变量是指向返回char*
的函数的指针。如果你这样做没有括号:
char **strcpy_ptr(char *dst, const char *src);
函数的 prototype 会返回char**
- 而不是你想要的。括号是使用变量对一颗星进行分组,并从返回类型中分离出星号。
请记住,指针的声明如下:
T *var;
其中T
是某种类型。您添加的星星越多,您在最终到达实际T
之前添加的间接级别就越多。因此char **c
将指向指向char
的指针。函数指针也是如此:T
是char*
,而*var
必须用括号分隔,因为C不知道空格。 C只是添加了一些额外的语法来指定函数采用指针所指向的参数类型和数量。这只是C工作方式的一部分。
答案 1 :(得分:1)
没有parens,你会得到:** strcpy_ptr
这是指向指针或双重间接的指针。我认为“一级”意味着只有一个层次的间接。
答案 2 :(得分:1)
@Adel:以上评论的大部分内容都有一定道理(几乎没有像C这样的挑剔异常不理解空格),我仍然建议你阅读Kernighan和Ritchie撰写的“C编程语言”,第二版版本,第5.11章,特别是第5.12章(复杂的表达式-p122):你会发现许多复杂的例子,理解它们中的每一个都很重要。
特别是,了解之间的差异:
和
2.char(*(* x [])())[]
cforfun。