zoukankan      html  css  js  c++  java
  • 函数指针

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

            

      

  • 相关阅读:
    solr
    2.配置Flutter代码编辑器(IDE)
    1.Flutter的下载安装和环境配置
    ReactNative开发环境配置,新手踩坑必备.我也是新手
    汉字转拼音,获取汉字首字母
    For循环性能优化
    JavaScript滑块简易取色器
    C# 获取汉字拼音首字母(修正X问题,真正修正)
    团队项目-个人博客5.31
    团队项目-个人博客5.30
  • 原文地址:https://www.cnblogs.com/Higgerw/p/9849779.html
Copyright © 2011-2022 走看看