函数指针的用法浅析!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010672206/article/details/9077463

 

我只是听说到时候要学数据结构还是什么的要用回调函数,而回使用调函数,函数的指针是必不可少的!

然而,函数指针的用法,确实有点难理解,目前自己发现了两种函数指针调用函数的方法。请看下面的例子!

#include <iostream>
using namespace std;
int max(int b,int l)
{
    if(b>l)
       return b;
    else
    return l;
}

int main()
{
    int n=11,v=2;
    int (*p)(int,int);
    p=max;
    n=p(1,2);
    printf("%d\n",n);
  system("pause");
    return 0;
}
这个程序是调用一个取最大值函数的程序。在这里用到了函数指针,即不仅可以用函数名调用相应的函数
而且还可以使用函数指针来进行相应的操作!
函数指针定义的格式: 函数的返回值类型 (*p)(参数的类型)(例如上面的int (*p)(int,int)中的(int,int))
记住:(*p)的括号千万不能丢,丢了的话就变成了声明一个 返回值为指针的函数了!因为 *号的结合率最低!
再此应该注意: 一般在写函数指针的时候不要写重名的函数指针,应为在调用函数的时候是根据函数指针名加上
后面的形参列表即形参类型和形参数目决定的。
(注;这里p可以为任意的符合标示符明命规则的符号,他只是代表函数指针的名字而以)
下面就简单的说说函数指针的用法:
经函数名用赋值号的形式赋值给函数的指针,可以这样理解函数名存储着调用这个函数时内存在栈去给此函数分配
的内存的首地址,即此函数的入口!这样比较着一般的指针的用法就可以较容易的理解 这样的调用形式,拿上面
的程序的一段语句来说:
int (*p)(int,int);
    p=max;
    n=p(1,2);《=》n=max;
上面说的就是第一种利用函数指针调用函数的方式。
那么第二种就是这样:
int (*p)(int,int);
    p=max;
    n=(*p)(1,2);也《=》n=max;
但是为什么可以这样操作自己也是难以把握你可以理解为用*将这个函数的入口的地址给取出来!但是我还是鼓励大家使用第一种
方法操作,这样有助于理解和操作(当然此时是*号和P先进行的运算)!对于第二种的用法 感兴趣的可以深入的探究一番,
当然知道的也非常希望您能和我交流!但是下面的这一种操作是错误的:
int (*p)(int,int);
    p=max;
    n=*p(1,2);
因为前面讲到的*号操作符的结合率最低,那么p指向的函数返回一个整型数据在和 *号结合再赋给一个整型的变量那么得到的什么呢!
所以就会报错了!

请看下面的代码:
#include <iostream>
using namespace std;
int *max(int b,int l)//此函数是一个返回值为指针的函数!
{
    if(b>l)
       return &b;
    else
    return &l;
}

int main()
{
    int n=11,v=2;
    int *h;
    int *(*p)(int,int);//所以在声明该函数的指针时返回值类型要为: int *;
    p=max;
    h= p(1,2);
    printf("%d\n",n);
    system("pause");
    return 0;
}
看下面的这两条语句,
p=max;
    h= p(1,2);//这里的调用大家一定会很容易的理解了!h是一个整型的指针!
但是 我这样写 n= *p(1,2)这也是对的!
大家可能会有疑问了!我上面不是说过不能 *p这样的操作吗!
请大家看清楚了: n 是一个整型的变量 而返回的是一个整型的指针 但是前面加了一个 *号之后就变成了 取出指针地址所存储的数值
赋给一个 整形变量!
但是此时如果 去掉 * 号就错了! 他会这样报错!
 conversion from `int*' to `int' 将整型的指针赋给一个整形的变量 当然是因为没加 * 取值符号了!哈哈!
相信在多次的解释之下大家应该有所体会,请大家多多动手,自然就会明白了!

 

 

猜你喜欢

转载自blog.csdn.net/u010672206/article/details/9077463
今日推荐