以下声明是什么意思?
char *(*g(char a, int b))
到目前为止,我知道,
char *(*g)(char, int)
声明一个指向返回 char *
的函数的指针,我可以成功地为它赋值,但是我不能对第一个做同样的事情。有什么提示吗?
答案 0 :(得分:2)
它看起来像一个函数 g
,它接受两个参数(char a
和 int b
)并返回 char**
。
外括号看起来像 char** x = /* some value */; char y = *(*x);
作为证明,这段代码可以编译:
char *(*g(char a, int b));
char** test(void) {
return g(0, 0);
}
答案 1 :(得分:2)
问题中的两行代码差别很大:
char *(*g(char a, int b)) // #1
char *(*g)(char, int) // #2
在 #2 中,您在 )
之后添加了一个 g
,这确实改变了很多含义。
第一个只是一个名为 g
的函数。一样的
char **g(char a, int b) // #1 without the unnecessary ( ) pair
但第二个是名为 g
的函数指针变量。
这也解释了为什么您可以在情况 #2 时分配给 g
,而在情况 #1 时不能分配给 g
。
另请注意,#1 是返回 pointer-to-pointer-to-char 的函数,而 #2 是指向返回 pointer-to-char 的函数的函数指针强>
所以这两行代码有不止一个方面的不同。
答案 2 :(得分:1)
{
"type": "COLUMN",
"properties": {
"span": 2
},
"children": [
{
"rest of the code here"
},
],
},
{
"type": "COLUMN",
"properties": {
"span": 10,
},
"children": [],
},
"rest of code"
是什么意思?
g as function (char, int) returning pointer to pointer to char
答案 3 :(得分:0)
当你写:
char *(*g)(char, int);
g 是一个指向函数的指针...
你是否有几个函数接受一个字符和一个整数作为参数并返回一个'char *',你可以将这些函数中的任何一个分配给这个指针..
示例:
char *function1(char c, int i) {
...
}
char *function2(char c, int i) {
...
}
当你像下面看到的那样声明一个指针时,它可以指向上述任何一个函数:
char *(*g)(char, int);
你可以写:
g = function1 ;
或:
g = function2 ;
当你使用指针调用函数时:
char *retVal = (*g)('a', 12) ;
它将根据分配给指针的最后一个函数调用 function1 或 function2。
至于:
char *(*g(char a, int b))
这相当于:
char **g(char a, int b)
考虑到运算符 () 的优先级为 1,运算符 * 的优先级为 2,括号不影响计算顺序。