如何声明一个函数指针?
How to declare a function pointer?
我遇到了这两个程序:
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)
这不是函数指针声明。这是 getb
函数的 前向声明。
void (*fun_ptr)(int) = &fun;
这个是一个函数指针变量声明。
请注意,在 C 中,寻址运算符 &
是隐式的,因此这两个语句的行为相同:
void (*fun_ptr)(int) = &fun;
void (*fun_ptr)(int) = fun;
看这里:Function pointers and address of a function
int* getb(int* p);
这不是一个函数指针,它是一个 function prototype。 C 编译器不会 "look ahead" 用于函数,因此如果您正在调用尚未定义的函数,则需要在调用位置上方放置一个列出函数参数和 return 类型的原型.这就是第一个程序中发生的事情。
void (*fun_ptr)(int) = &fun;
这个是一个函数指针。它创建一个名为 fun_ptr
的变量,指向函数 fun()
.
这个声明
int* getb(int* p);
不是函数指针的声明。它是一个函数的声明,该函数具有指向 int 的 return 类型指针,即 int *
和一个相同类型的参数:指向 int.
的指针
函数类型为
int * ( int * )
要声明指向您必须编写的函数类型的指针,例如
int * ( *fun_ptr )( int * ) = getb;
这个声明
void (*fun_ptr)(int) = &fun;
确实是一个指向函数类型void( int )
的指针的声明,它由函数fun
的地址初始化。
你可以写
void (*fun_ptr)(int) = fun;
因为表达式中使用的函数指示符被转换为指向函数的指针。
并调用用作指针初始化器的函数 fun_ptr
你可以只写
fun_ptr(10);
我遇到了这两个程序:
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)
这不是函数指针声明。这是 getb
函数的 前向声明。
void (*fun_ptr)(int) = &fun;
这个是一个函数指针变量声明。
请注意,在 C 中,寻址运算符 &
是隐式的,因此这两个语句的行为相同:
void (*fun_ptr)(int) = &fun;
void (*fun_ptr)(int) = fun;
看这里:Function pointers and address of a function
int* getb(int* p);
这不是一个函数指针,它是一个 function prototype。 C 编译器不会 "look ahead" 用于函数,因此如果您正在调用尚未定义的函数,则需要在调用位置上方放置一个列出函数参数和 return 类型的原型.这就是第一个程序中发生的事情。
void (*fun_ptr)(int) = &fun;
这个是一个函数指针。它创建一个名为 fun_ptr
的变量,指向函数 fun()
.
这个声明
int* getb(int* p);
不是函数指针的声明。它是一个函数的声明,该函数具有指向 int 的 return 类型指针,即 int *
和一个相同类型的参数:指向 int.
函数类型为
int * ( int * )
要声明指向您必须编写的函数类型的指针,例如
int * ( *fun_ptr )( int * ) = getb;
这个声明
void (*fun_ptr)(int) = &fun;
确实是一个指向函数类型void( int )
的指针的声明,它由函数fun
的地址初始化。
你可以写
void (*fun_ptr)(int) = fun;
因为表达式中使用的函数指示符被转换为指向函数的指针。
并调用用作指针初始化器的函数 fun_ptr
你可以只写
fun_ptr(10);