在C/C++中,如果我有以下函数:
```
void foo();
void bar(void (*funcPtr)());
这两个调用之间有区别吗:
bar(foo);
bar(&foo);
?
```
void foo();
void bar(void (*funcPtr)());
这两个调用之间有区别吗:
bar(foo);
bar(&foo);
?
bar(foo);
被称为“短”版本
bar(&foo);
是官方的写法
从功能上来说,两者没有区别,但第二种选项被大多数人认为是“良好的实践”,因为这样更明显地表明foo实际上是一个函数指针而不是一个实际的函数。
这与数组类似。如果你有:
int foobar[10];
那么 foobar 是一个 int *,但你也可以使用 &foobar 得到相同的结果。
int foobar[10];
,则foobar
是一个int [10]
(包含10个整数的数组),但可以根据需要将其_隐式转换为_ int *
(指向第一个整数的指针)("数组退化");特别地,sizeof foobar
等于10 * sizeof(int)
,而不是sizeof(int*)
。另外,&foobar
是一个int (*)[10]
(指向包含10个整数的数组的指针),这完全是另一种类型(_不能_转换为int*
)。 - gx_&foobar[0]
(或者 &(foobar[0])
)的写法,具有讽刺意味的是,它只是 &(*(foobar + 0))
的一种简便写法,也就是 foobar + 0
,其中 foobar
被隐式转换为指向其第一个元素的指针... - gx_
bar(*foo);
也等同于这两个表达式。bar(***** foo);
也是如此。 - Mike Seymour&foo
,因为这明确表明我想要一个函数指针,而不仅仅是忘记调用函数。 - sp2danny