C语言:函数指针解释

目录

一.概念

看代码

运行结果是

二.函数指针写法

代码

运行结果

代码

运行结果是

注意

代码

 再举个例子

运行结果是

问题

 问题1

答案

问题2

答案


一.概念

函数指针:首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址;
数组指针是指向数组的指针
函数指针是指向函数的指针–存放函数地址的一个指针

看代码

#include<stdio.h>
void test()
{
    printf("hehe\n");
}
int main()
{
    printf("%p\n",test);
    printf("%p\n",&test);

}

运行结果是

从这里我们就可以看出:&函数名和函数名都是函数的地址

二.函数指针写法

代码

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}

int main()
{
    int a=10;
    int b=20;
    printf("%d\n",Add(a,b));
    
}

上面是最常用的函数调用方法,下面我们就用函数指针试试

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}

int main()
{
    int a=10;
    int b=20;
    printf("%d\n",Add(a,b));
    int (*p)(int,int)=Add;//函数指针的写法跟数组指针的类似
    printf("%d\n",(*p)(a,b));
    printf("%d\n",(*p)(2,3));

}

运行结果

我们刚刚知道:&函数名和函数名都是函数的地址,那么我们还可以写成

代码

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}

int main()
{
    int a=10;
    int b=20;
    printf("%d\n",Add(a,b));
    int (*p)(int,int)=&Add;//函数指针的写法跟数组指针的类似,这里加上了&
    printf("%d\n",(*p)(a,b));
    printf("%d\n",(*p)(2,3));

}

运行结果是

 

 加不加&-取地址符最后的结果都是一样的

注意

上述代码中的*没有太大价值,就算写p,*p,**p,***p,……最后的结果都是没有影响的

代码

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}

int main()
{
    int a=10;
    int b=20;
    printf("%d\n",Add(a,b));
    int (*p)(int,int)=Add;//函数指针的写法跟数组指针的类似,这里加上了&
    printf("%d\n",(p)(2,3));
    printf("%d\n",(*p)(2,3));
    printf("%d\n",(**p)(2,3));
    printf("%d\n",(***p)(2,3));

}

运行结果

 再举个例子

#include<stdio.h>
void print(char* str)
{
    printf("%s\n",str);
}
int main()
{
    void (*p)(char*)=print;//把函数print的地址传给p
    (*p)("hello world!");//(*p)就是利用指针的方法调用函数,它的效果跟直接调用函数是一样的
    print("hello world!");//直接调用函数
}

运行结果是

问题

 问题1

 对于这两行代码,请问pfun1或者pfun2哪个是指针?

答案

pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。

问题2

请解释这段代码
(*(void(*)()0))

答案

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳862

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值