Ric*_*son 11 c function-pointers
我对将函数指针赋给变量的正确语法有点困惑.如果我有一个函数foo
int foo();
Run Code Online (Sandbox Code Playgroud)
我正在将指向foo的指针分配给变量栏
void * bar;
Run Code Online (Sandbox Code Playgroud)
如果我使用它似乎并不重要
bar = foo;
// or
bar = &foo;
Run Code Online (Sandbox Code Playgroud)
在我看来,其中只有一个应该是正确的还是我错过了什么?
oua*_*uah 10
foo和&foo值在C中是等价的并且具有相同的类型.
&这里的操作员是正确但多余的.
请注意,为a指定函数指针void *在C中无效.
void *fp1 = foo; // invalid
int (*fp2)() = foo; // valid
int (*fp3)() = &foo; // valid
Run Code Online (Sandbox Code Playgroud)
(这些实际上是声明,但赋值运算符的约束适用.)
让我再解释一下。
foo 和 &foo 值在 C 中是等价的并且具有相同的类型。
正如@ouah 对答案的评论所指出的那样,这并不完全正确。特别:
sizeof(foo)无效,并且sizeof(&foo)是指针的大小。&foo是指向 foo 的指针,while&(&foo)是无效的。然而,它们在所有其他情况下实际上是相同的,正如 C 的标准所提到的(参考,例如C11的草案):
6.3.2.1.4:函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。
的sizeof和一元&运算符是唯一的两个例外当一个函数指示符不被转换为指针。
PS你也可以找到为什么sizeof(foo)和&(&foo)无效:
6.5.3.2.1:一元运算
&符的操作数应是函数指示符、[]一元运算*符或一元运算符的结果,或指定不是位字段且未使用寄存器存储声明的对象的左值 -特定类别。6.5.3.4.1
sizeof运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。
| 归档时间: |
|
| 查看次数: |
13630 次 |
| 最近记录: |