我遇到了这两个程序。
int* getb(int* p);
void main()
{
int x = 5 ;
int* ptr = getb(&x);
printf("%d\n",*ptr);
}
int* getb(int* p)
{
int* re = (int*)malloc(1*sizeof(int));
*re = *p *= 2;
return re;
}
void fun(int a)
{
printf("Value of a is %d\n", a);
}
int main()
{
void (*fun_ptr)(int) = &fun;
(*fun_ptr)(10);
return 0;
}
这两个程序的函数指针声明有什么不同?
int* getb(int* p);
和
void (*fun_ptr)(int) = &fun;
int* getb(int* p);
这不是一个函数指针,是一个 功能原型. C编译器不会对函数进行 "前瞻",所以如果你要调用一个还没有被定义的函数,你需要在调用站点上方放一个原型,列出函数的参数和返回类型。这就是第一个程序中的情况。
void (*fun_ptr)(int) = &fun;
这个 是 的函数指针。它创建了一个名为 fun_ptr
该函数指向 fun()
.
int* getb(int* p)
这不是一个函数指针声明。它是一个 远期声明 的 getb
功能。
void (*fun_ptr)(int) = &fun;
这个 是 函数指针变量声明。
注意,在C语言中,地址运算符 &
是隐式的,所以这两个语句的行为是一样的。
void (*fun_ptr)(int) = &fun;
void (*fun_ptr)(int) = fun;
参见这里 函数指针和函数地址
本声明
int* getb(int* p);
不是一个函数指针的声明。它是一个函数的声明,该函数的返回类型指针为int,它的返回类型是 int *
和一个相同类型的参数:int的指针。
函数类型为
int * ( int * )
要声明一个指向函数类型的指针,你必须写下例如
int * ( *fun_ptr )( int * ) = getb;
本声明
void (*fun_ptr)(int) = &fun;
确实是对函数类型指针的声明。void( int )
的地址初始化的。fun
.
你可以写
void (*fun_ptr)(int) = fun;
因为在表达式中使用的函数代号会转换为函数的指针。
而要调用作为指针的initiliazer使用的函数。fun_ptr
你可以直接写
fun_ptr(10);