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 }

            

      

  • 相关阅读:
    转:Contrastive Loss (对比损失)
    转:Siamese network 孪生神经网络
    pytorch的nn.MSELoss损失函数
    python创建包
    pytorch中如何在lstm中输入可变长的序列
    转:python中with的用法
    转:np.insert函数
    转:分类模型的评估指标
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task(构造)
    Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot
  • 原文地址:https://www.cnblogs.com/Higgerw/p/9849779.html
Copyright © 2011-2022 走看看