C语言——指针进阶

函数指针

我门直接通过一个简单的例子来讲解函数指针
函数指针最常用到的地方就是多肽
多态:一种接口(API函数),多种形态

#include<stdio.h>
int add(int a,int b)		//定义 + - * / 四个函数
{
        return a+b;
}
int sub(int a,int b)
{
        return a-b;
}
int div(int a,int b)
{
        return a/b;
}
int mut(int a,int b)
{
        return a*b;
}
int main()
{
        char opr;
        int a=100;
        int b=50;
        int (*pfun)(int ,int)=add;		//定义了一个函数指针,pfun指向+函数,结果返回a+b
        printf("%d\n",pfun(a,b));
        return 0;
}

在上述代码中,我们把可以将静态多态改成动态多态
将int (*pfun)(int ,int)=add 改成 int (*pfun)(int,int)
这样我们的pfun指向就不确定了,然后再动态调用;如:

int main()
{
        char opr;
        int a=100;
        int b=50;
        scanf("%c",&opr);
        int (*pfun)(int,int);      //动态多肽
        if(opr=='+')
                pfun=add;
        else if(opr=='-')
                pfun=sub;
        else if(opr=='/')
                pfun=div;
        else if(opr=='*')
                pfun=mut;
        printf("%d\n",pfun(a,b));
        return 0;
}

让用户手动输入+ - * / 然后输出结果
在这里插入图片描述
在上述例子中,我们可以再定义一个calc函数来调用±*/

int calc(int (*pfun)(int,int),int a,int b)		//形参列表,第一个为函数指针
{
	return pfun(a,b);
}

然后通过调用calc来实现 + - * /
这里再讲一个小知识点:强制转换
如果我再定义一个pfun1来指向calc改怎么写呢?

int (*pfun1)(int (*)(int,int),int,int)=calc;

然后我们来试试将0来赋给pfun1,改如何强转呢?

//pfun1是个函数指针,存放的是函数地址
pfun1=(int (*)(int (*)(int,int),int,int))0;		//强转完成

强转诀窍,去掉变量名,其余保持不变。

二级指针

指向指针的指针,存放一级指针的地址
//定义普通变量
/*      int a=100;
//一级指针的定义,存放普通变量的地址
        int *pa=&a;
//二级指针的定义,存放一级指针的地址
        int **ppa=&pa;
        printf("sizeof(ppa)=%d\n",sizeof(ppa));	//二级指针也是四个字节
        printf("%x %x %x %x\n",pa,ppa,&pa,&ppa);	//查看二级指针的地址与其存放的地址
        printf("%d  %d  %d\n",a,*pa,**ppa);		//打印a的值的三种方法
*/

在这里插入图片描述
上述通过打印一些数据,我们可以知道二级指针也是占4byte空间,其性质与一级指针相同,也是存放地址,只是二级指针存放的是一级指针的地址,也可以通过二级指针应用其内容的内容**ppa引用到一直指针指向的数据。

以一个简单的例子来讲解二级指针

#include<stdio.h>
void fun(int **ppa,int **ppb)		//用二级指针来接收传入的以及地址形参
{
        int *ppc=*ppa;			//交换pa与pb所指向的内容
        *ppa=*ppb;
        *ppb=ppc;
}
int main()
{
        int a=100;		//定义变量与其一级指针
        int b=200;
        int *pa=&a;
        int *pb=&b;
        printf("%d  %d\n",*pa,*pb);		//调用函数前指针pa指向a,pb指向b
        fun(&pa,&pb);			//调用函数,传入pa与pb的地址
        printf("%d  %d\n",*pa,*pb);		//调用函数后指针pa指向b,pb指向a
        
        return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值