• 代码常识函数指针


    很早的时候课上见过函数指针,后来就再也没有遇到过。以后我会留心标准C++里是否还用这个东西。函数指针说起来是个指针变量,指向一个函数的入口地址。函数的入口地址是什么,暂且不去细究,总之和普通变量地址,结构体地址,类地址一样,有了这个地址,就有了这个地址指向的实体。

    关于函数指针的几点常识:

    1.函数指针的声明

    函数类型 (*指针变量名)(形参列表);

    “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,如果不加括号,代码就成了声明一个返回类型为指针类型的函数(指针函数),后面的“形参列表”表示指针变量指向的函数所带的参数列表。

    例如:

    int (*f)(int x);

    2.函数指针的赋值

    函数名和数组名一样代表了函数代码的首地址,函数名和数组名都是地址常量(不可修改,不可赋值,只能做右值),因此在赋值时,直接将函数指针指向函数名就行了。

    注意:赋值时要求函数指针和他指向函数的格式一致才可以赋值,即函数返回类型一致,参数列表一致。否则无法赋值。

    另外,赋值语句的语法格式,和函数调用格式有点奇怪,如下面的代码:

     1 int print(int x)
     2 {
     3     cout<<x<<endl;
     4     return 0;
     5 }
     6 
     7 int _tmain(int argc, _TCHAR* argv[])
     8 {
     9     int a=10;
    10 
    11     int (* p)(int);    //声明两个函数指针
    12     int (*p2)(int);    
    13 
    14     p=print;           //用两种形式赋值,貌似第二种不合法,但经验证却是成功的
    15     p2=(*p);            //经验证这种方式是成功的,但是(*p2)=p是错的
    16 
    17     (*p)(a);           //用两种形式调用函数,貌似第二种不合法,但经验证却是成功的
    18     p(a); 
    19 
    20     (*p2)(a); 
    21     p2(a); 
    22
    23     getchar(); 
    24     return 0; 
    25 }

    也就是说,p的值竟然和(*P)的值是一样的。有人认为,C语言中,本着指针的使用原理,函数指针使用时加*(dereference operator);C++中为跟函数对象统一,所以不加*。因此,语法上函数指针使用时加不加*都一样。

  • 相关阅读:
    汉语-词语:注重
    汉语-词语:解释
    汉语-词语:接受
    汉语-词语:专注
    汉语-词语:构想
    生物-植物-果树:枣树
    汉语-词语:维度
    汉语-词语:真传
    XML基础知识学习
    Java Swing界面编程(25)---事件处理:鼠标事件及监听处理
  • 原文地址:https://www.cnblogs.com/kevinGaoblog/p/2479749.html
Copyright © 2020-2023  润新知