C语言:理解函数指针和定义

之前,我们就接触过数组指针,数组指针是用来存放数组的地址,同理,函数指针就是用来存放函数的地址.那么函数指针怎么用呢,看这样一段代码:

#include <stdio.h>
#include <stdlib.h>

void test(char* str)
{
    printf("%s\n", str);
}
int main()
{
    test("hello");
    system("pause");
    return 0;
}


分析:test把hello的首地址传给了str,所以打印的就是hello,程序一走,结果就是helo,没问题。那么我们怎样拿到一个函数的地址呢?数组的地址,我们取地址就可以了,那么函数的地址是不是也是直接取地址呢?我们来看一下:如果是地址,我们通过%p的形式打印出来,代码入下:

#include <stdio.h>
#include <stdlib.h>

void test(char* str)
{
    printf("%s\n", str);
}
int main()
{
    printf("%p\n", &test);
    system("pause");
    return 0;
}

我们来看看打印结果:

0131114F,果然是一个地址,我们知道,&数组名,取出的是数组的地址,数组名也是个地址,而且是首元素的地址,他们的意义不同,但是值是一样的,那我们能不能只写个函数名,也说它是个地址呢,通过验证,我们发现是可以的,函数的地址通过&函数名拿到,也可以直接通过函数拿到,那么又有一个问题,函数的&函数名取的是函数的地址,函数名单独放是不是表示函数的首元素地址呢?但是我们知道函数哪来的首元素,所以说:函数的地址就不能跟数组的地址类比了,函数的名字取地址和函数名作为地址是一模一样的,都代表函数的地址,没有区别。
函数的地址,我们已经有办法获取,那如果想要把函数的地址存起来,怎么存?这就引入了函数指针。

下面来看两个有趣的代码:

(*(void(*)())0)();

这句代码的意思是:调用0地址处的函数,调用的函数的参数是无参,返回类型 为void     (具体分析请详看 《深度理解指针数组, 函数指针数组.......》那篇博客)

void(*signal(int,void(*)int)))(int);

这句代码的意思是: signal是一个函数声明,函数的参数为int和一个函数指针;该函数指针指向的函数参数为int,返回类型为void;signal函数的返回类型也为函数指针,该函数指针指向的参数为int,返回类型为void(具体分析请详看《深度理解指针数组, 函数指针数组.......》那篇博客)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值