字符* (*名称())[];这个语句是函数指针数组吗?
char* (*name())[]; Is this statement array of function pointers?
这句话让我深思。我最终得到一个结论函数指针 returns 字符数组。但是我无法给自己正确的推理。
不是,是函数原型。函数返回指向 char *
指针数组的指针。函数采用未指定的参数
如果你想让函数指针返回指向char
的指针数组,它必须像这样声明
char* ((*name)())[];
声明呈现了某物将如何使用的“图片”。声明 char* (*name())[];
表示 * (*name())[]
是 char
.
- 那么
(*name())[]
就是一个指向char
的指针。
- 那么
(*name())
就是指向char
的指针数组。
- 那么
*name()
就是指向char
的指针数组。
- 那么
name()
就是指向char
的指针数组的指针。
- 那么
name
就是一个函数,returns一个指向char
的指针数组的指针。
char* (*name())[];
使用此语句,您声明了一个名为 name
的函数,该函数允许接受任何参数和 returns 指向指向 char
的指针数组的指针,而不是函数指针returns char
的数组。
是函数name
的声明或"prototype"。
请注意,为了在源代码中使用 name
,您还需要函数 name
的定义(函数实际在做什么)。
如果您想确定某种类型的 C 构造,您可以使用 Ross J. Anderson 制作的 Clockwise/Spiral Rule made by David Anderson; but not to confuse with Anderson`s Rule,这是非常独特的东西。
这样的变量声明按照运算符优先级.
从里到外读取
在这种情况下:
name
是...的名称...
name()
函数(优先级,()
运算符的优先级高于*
运算符!),其中returns一个...
*name()
指向 ... 的指针
(*name())[]
数组(优先级,[]
运算符的优先级高于 *
运算符!)...
*(*name())[]
指向...
char*(*name())[]
个字符。
这基本上等同于 Eric Postpischil 的方法,但它更清楚地显示了运算符优先级发挥作用的地方。
顺便说一句:一旦您理解了这个变量声明,C 语言中就没有您无法理解的变量声明。
这样读(使用Clockwise/Spiral规则):
char* (*name())[];
1) 找到标识符。
char* (*name())[];
^^^^
"name is a"
2) 向右移动。
char* (*name())[];
^^
"name is a function accepting any parameter and returning"
3) 因为右括号不能再向右移动,所以向左移动。
char* (*name())[];
^
"name is a function accepting any parameter and returning pointer to"
4) 因为左括号不能再向左移动,所以继续
正确的。
char* (*name())[];
^^
"name is a function accepting any parameter and returning pointer to an array"
5) 不能再向右移动了,因为我们没有符号了,所以向左走。
char* (*name())[];
^
"name is a function accepting any parameter and returning pointer to an array of pointers to"
6) 最后,继续向左走,因为右边什么都没有了。
char* (*name())[];
^^^^
"name is a function accepting any parameter and returning pointer to an array of pointers to char".
这句话让我深思。我最终得到一个结论函数指针 returns 字符数组。但是我无法给自己正确的推理。
不是,是函数原型。函数返回指向 char *
指针数组的指针。函数采用未指定的参数
如果你想让函数指针返回指向char
的指针数组,它必须像这样声明
char* ((*name)())[];
声明呈现了某物将如何使用的“图片”。声明 char* (*name())[];
表示 * (*name())[]
是 char
.
- 那么
(*name())[]
就是一个指向char
的指针。 - 那么
(*name())
就是指向char
的指针数组。 - 那么
*name()
就是指向char
的指针数组。 - 那么
name()
就是指向char
的指针数组的指针。 - 那么
name
就是一个函数,returns一个指向char
的指针数组的指针。
char* (*name())[];
使用此语句,您声明了一个名为 name
的函数,该函数允许接受任何参数和 returns 指向指向 char
的指针数组的指针,而不是函数指针returns char
的数组。
是函数name
的声明或"prototype"。
请注意,为了在源代码中使用 name
,您还需要函数 name
的定义(函数实际在做什么)。
如果您想确定某种类型的 C 构造,您可以使用 Ross J. Anderson 制作的 Clockwise/Spiral Rule made by David Anderson; but not to confuse with Anderson`s Rule,这是非常独特的东西。
这样的变量声明按照运算符优先级.
从里到外读取在这种情况下:
name
是...的名称...name()
函数(优先级,()
运算符的优先级高于*
运算符!),其中returns一个...*name()
指向 ... 的指针
(*name())[]
数组(优先级,[]
运算符的优先级高于*
运算符!)...*(*name())[]
指向...char*(*name())[]
个字符。
这基本上等同于 Eric Postpischil 的方法,但它更清楚地显示了运算符优先级发挥作用的地方。
顺便说一句:一旦您理解了这个变量声明,C 语言中就没有您无法理解的变量声明。
这样读(使用Clockwise/Spiral规则):
char* (*name())[];
1) 找到标识符。
char* (*name())[];
^^^^
"name is a"
2) 向右移动。
char* (*name())[];
^^
"name is a function accepting any parameter and returning"
3) 因为右括号不能再向右移动,所以向左移动。
char* (*name())[];
^
"name is a function accepting any parameter and returning pointer to"
4) 因为左括号不能再向左移动,所以继续 正确的。
char* (*name())[];
^^
"name is a function accepting any parameter and returning pointer to an array"
5) 不能再向右移动了,因为我们没有符号了,所以向左走。
char* (*name())[];
^
"name is a function accepting any parameter and returning pointer to an array of pointers to"
6) 最后,继续向左走,因为右边什么都没有了。
char* (*name())[];
^^^^
"name is a function accepting any parameter and returning pointer to an array of pointers to char".