c++/c 函数指针详解

1 函数指针

今天我们要介绍的是函数指针。内容由以下3部分组成:

① 函数指针的概念,为了面试时能够说出来。

② 函数指针的用法 当然是为工作用到喽

③ 函数指针的实例,用一些练习来加深印象。

④经典面试题:函数指针和指针函数的区别

好 开始!

①函数指针的概念:

1.1 函数指针: 是指向函数的指针变量
在程序运行中,函数是程序算法指令部分,他们和数组一样也占用内存空间,也都有相应的地址。我们程序员可以使用指针变量指向数组的首地址,同样,也可以使用指针变量指向函数代码的首地址, 指向函数代码首地址的指针变量,称为函数指针。

1.2 函数指针有两个用途:调用函数和做函数的参数。

② 函数指针的用法

2.1 用法:返回值类型 ( * 指针变量名) ([形参列表]);

注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

//比较两个string对象的长度
bool lengthCompare(string ch1 , string ch2);

该函数的类型是bool ( string , string ) 。要想声明一个可以指向该函数的指针,只需要替换函数名字即可。

// pf 指向一个函数,该函数的参数是两个 string的引用,返回值是bool类型。
bool (*pf)(string ch1 , string ch2 );  //声明了一个函数指针

注2:函数括号中的形参可有可无,视情况而定。

③ 函数指针的实例

下面的简单例子说明函数指针调用的方法。

#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
    int (*ptr)(int, int);
    int a, b, c;
    ptr = max;
    scanf("%d%d", &a, &b);
    c = (*ptr)(a,b);
    printf("a=%d, b=%d, max=%d", a, b, c);
    return 0;
}

输入5 , 2 结果如下:这里写图片描述

此外 在上个例子中
ptr = max ; 也可以写成 ptr = & max ;
等价的赋值语句,取地址符是可选的。
此外,我们还能直接使用指向函数的指针来调用该函数,无需提前解引用指针。

int d1 = ptr( 1 , 2 );  //调用max函数
int d2 = (*ptr)( 1 , 2 );//一个等价的调用 
int d3 = max(1 , 2 );  //另一个等价的调用 

④函数指针和指针函数的区别
关键考点:
指针函数的概念;
指针函数的使用。

考题分析:
函数不仅可以返回整型,字符型等数据类型的数据,还可以返回指针类型的数据,使其指向某个地址单元,返回指针的函数称为指针函数,指针函数的定义示例代码如下.

int &test(x,y);

上面代码中 x ,y 是形式参数,test()是函数名,调用函数后会返回一个指向整型数据的地址指针。test(x,y) 是函数,他的值是指针。
使用代码如下:

#include<stdio.h>

char *ch(char *str1 ,char *str2)
{
    int i;
    char *p;
    p = str2;
    if(*str2 == NULL)
    {
        printf("cuocuocuo");
    }
    do
    {
        *str2 = *str1;
        str1++;
        str2++;
    }while (*str1!=NULL);
    return p;
}
int main()
{
    char *ch(char *, char *); //调用函数
    char str1[] = "HELLO";
    char str2[] = "123456789";
    printf("%s",ch(str1,str2));//打印结果

}

结果输出 ” HELLO6789”
上面代码,函数char *ch()表示的就是一个返回字符型指针的函数。

答案:函数指针是一个指向函数的指针。他的本质是一个指针,而指针函数只是说明他是一个返回值为指针的函数,它本质是一个函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值