zoukankan      html  css  js  c++  java
  • 代码常识函数指针

    很早的时候课上见过函数指针,后来就再也没有遇到过。以后我会留心标准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++中为跟函数对象统一,所以不加*。因此,语法上函数指针使用时加不加*都一样。

  • 相关阅读:
    【POJ 1958】 Strange Towers of Hanoi
    【HNOI 2003】 激光炸弹
    【POJ 3263】 Tallest Cow
    【POJ 2689】 Prime Distance
    【POJ 2777】 Count Color
    【POJ 1995】 Raising Modulo Numbers
    【POJ 1845】 Sumdiv
    6月16日省中集训题解
    【TJOI 2018】数学计算
    【POJ 1275】 Cashier Employment
  • 原文地址:https://www.cnblogs.com/kevinGaoblog/p/2479749.html
Copyright © 2011-2022 走看看