函数指针

  函数指针的本质还是一个指针,它本身占用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 }

        

  

原文地址:https://www.cnblogs.com/Higgerw/p/9849779.html