函数指针
函数指针的本质还是一个指针,它本身占用4个字节(32位系统中指针都是4个字节)。函数指针、数组指针、普通指针之间本质上没什么区别,区别仅在于指针指向的东西是什么。函数的实质是一段代码,具体来说是一段在内存中连续分布的代码。所以对于函数来说最关键的就是函数中第一句代码的位置,在C语言中就用函数名这个符号来表示。
假设有一个函数是void f1(void),这个函数是非常简单的;它的传参是void类型,它的返回值也是void类型。如果写该函数对应的函数指针,则应该是 void (*p)(void);其中p这个名称是随便定义的,类型是void (*) (void)。代码如下:
1 #include <stdio.h> 2 void sayHello(); 3 void sayHello(){ 4 printf("hello world\n"); 5 } 6 int main() { 7 sayHello(); //先直接使用函数名调用1次 8 void (*sayHelloPtr)() = sayHello; //函数指针指向函数名,也就是函数sayHello指向的代码地址 9 (*sayHelloPtr)(); 10 sayHelloPtr(); 11 return 0; 12 }
上面的代码中,定义了两种函数指针调用形式:(*sayHelloPtr)(); sayHelloPtr();效果是一样的。
函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的,但是数组名做右值时加不加&意义就不同。把代码修改一下:
void sayHello(){ printf("hello world\n"); } int main() { sayHello(); void (*sayHelloPtr)() = &sayHello; //函数名前加个& (*sayHelloPtr)(); sayHelloPtr(); return 0; }
仍然能够准确执行。
对于复杂一点的函数,以strcpy函数为例,他实现了字符串*src拷贝给字符串*dest,原型是 char *strcpy(char *dest,const char *src) ;
对应的函数指针式 char *(*pFunc)(char *dest,const char *src) 测试代码如下:
1 #include <stdio.h> 2 #include<string.h> 3 4 int main(){ 5 char temp[5]={0}; 6 char* (*pFunc)(char *,const char *); 7 pFunc=strcpy; 8 pFunc(temp,"hello"); 9 printf("temp=%s.\n",temp); 10 return 0; 11 }