读书人

C语言函数指针干参数不加*号也行

发布时间: 2013-01-23 10:44:49 作者: rapoo

C语言函数指针作参数,不加*号也行?
下面的程序运行通过了:
#include<stdio.h>
int f(int x)
{
return x+100;
}

void g(int p(int))
{
printf("%d",p(1));
}
void main()
{
g(f);
}
和这种写法一样的结果:
void g(int (*p)(int))
{
printf("%d",p(1));
}
-----------------------------------
这两种写法是等价的吗?
[解决办法]


void g(int (*p)(int))//p是一个函数指针,p的值是函数的地址,p(1),调用函数
{
printf("%d",p(1));
}

void g(int p(int))//p是一个指向函数的变量,相当于typedef int p(int)
{
printf("%d",p(1));
}


[解决办法]
typedef int PF(int); ?
什么
typedef int (*PF)(int);
[解决办法]
可以把函数和数组看成特殊的指针:指向自己的指针
但自己没有存储地址的实体所以不能做赋值运算
[解决办法]
C里面函数名确实可用作函数指针,我曾经在Turbo C和VC6你都这么用。不过据说在有些编译器下是不可以的(也许是早期的GCC),所以是一个编译器允许的扩展。最严格的写法还是应当写成指针。
[解决办法]
这是语法规定等价的

C99标准 ISO/IEC 9899:1999
中 6.9.1
14 EXAMPLE 2 To pass one function to another, one might say
int f(void);
/* ... */
g(f);
Then the definition of g might read
void g(int (*funcp)(void))
{
/* ... */
(*funcp)(); /* or funcp(); ... */
}
or, equivalently,
void g(int func(void))
{
/* ... */
func(); /* or (*func)(); ... */
}

C89是 6.7.1
[解决办法]
规定就是这样了。

读书人网 >C语言

热点推荐