变量有地址,数组有地址,那么函数是否有地址呢?
有
int Add(int x,int y){
return x+y;
}
int main()
{
pritnf("%p\n",&Add);
pritnf("%p\n",Add); //&函数名和函数名都是函数的地址,没有区别。
return 0;
}
若是想存放起来:int (*pf)(int,int) = &Add; //pf**:函数指针变量**。
去掉名字:则就是函数指针pf类型:int (*)(int,int) 函数指针类型。
若是:
int (*pf)(int,int)=Add;
int ret=(*pf)(4,5); // *可写可不写,对其没有影响。写的话必须带上小括号。
pritnf("%d\n",ret);
例题:
int mian()
{
(*(void)(*) ( ) ) 0 ( );
return 0;
}
其中的 (*(void)(*) ( ) ) 0 ( );是什么意思?
由此可见函数指针类型是:void (*)( ) ,这是强制类型转换。例如int (3.14)
也是一次函数调用 ,调用0的地址存放的那个函数。
0地址出放的这个函数是没有参数的,返回类型是void.
例题:
void (*signal (int,void(*) (int) ) ) (int);
signal:函数名,跟圆括号结合了。
(int,void(*) (int) ) 是函数参数,整形,一种函数指针类型 ,可接收一函数地址。
剩下的就是返回类型,void(*)(int)--函数指针类型
该函数指向函数参数int ,返回类型void.
函数定义:
int Add(int x,int y)
{
return x+y;
}
函数调用:Add(3,5);
函数声明:int Add(int,int);