函数指针的实质(还是指针变量)

(1)函数指针的实质还是指针,还是指针变量。本身占4字节(在32位系统中,所有的指针都是4字节)
(2)函数指针、数组指针、普通指针之间并没有本质区别,区别在于指针指向的东西是个什么玩意。
(3)函数的实质是一段代码,这一段代码在内存中是连续分布的(一个函数的大括号括起来的所有语句将来编译出来生成的可执行程序是连续的),所以对于函数来说很关键的就是函数中的第一句代码的地址,这个地址就是所谓的函数地址,在C语言中用函数名这个符号来表示。
(4)结合函数的实质,函数指针其实就是一个普通变量,这个普通变量的类型是函数指针变量类型,它的值就是某个函数的地址(也就是它的函数名这个符号在编译器中对应的值)

函数指针的书写和分析方法

(1)C语言本身是强类型语言(每一个变量都有自己的变量类型),编译器可以帮我们做严格的类型检查。
(2)所有的指针变量类型其实本质都是一样的,但是为什么在C语言中要去区分它们,写法不一样呢(譬如int类型指针就写作int p; 数组指针就写作int (p)[5],函数指针就得写得更复杂)
(3)假设我们有个函数是: void func(void);
对应的函数指针:void (*p)(void);
类型是:void (*)(void);
(4)函数名和数组名最大的区别就是:函数名做右值时加不加&效果和意义都是一样的;但是数组名做右值时加不加&意义就不一样。
(5)写一个复杂的函数指针的实例:
譬如函数是strcpy函数char *strcpy(char *dest, const char *src);,对应的函数指针是:char *(*pFunc)(char *dest, const char *src);

代码示例

    #include<stdio.h>
    #include<string.h>
    
    void func1(void)
    {
        printf("test func pointer.\n");
    }
    
    int main(void)
    {
        char a[5] = {0};
        char *(*pfun2)(char*,const char*);
        pfun2 = &strcpy;
        pfun2(a,"12345");
        printf("a = %s.\n",a);
       /* void (*pfunc)(void);
        pfunc = func1;//pfunc = func1;与pfunc = &func1;结果是一样的。
                     //函数做右值时,前面加不加&都是代表地址,是一样的。
        pfunc();
        */
        
        /*
        int *p;
        int a[5] = {0,1,2,3,4};
    
        int (*p1)[5];
        p1 = &a;  //p1是int(*)[5]类型  &a也是int(*)[5]类型
        p = a;
        //p = &a; //&a是int(*)[5]类型
    
    
        printf("p = %p.\n",p);
        printf("a[0] = %p.\n",a);
        printf("p = %d.\n",*p+2);
        */
        return 0;
    }
最后修改:2019 年 09 月 28 日
如果觉得我的文章对你有用,请随意赞赏