【C语言】函数指针

举报
謓泽 发表于 2023/09/30 16:07:29 2023/09/30
【摘要】 【C语言】函数指针

🌀 函数指针 

数组指针是指向数组的指针

函数指针是指向函数的指针,存放函数地址的指针。

那么 & 地址函数名,取出的就是函数的地址。

从这里我们就联想到了 数组名 != &数组名,那么函数也是这样的吗?

答案:不是!函数名 == &函数名(完全等价)

示例,如下代码所示 👇

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x,int y)
{
	return x + y;
}
int main(void)
{
	int a = 10;
	int b = 20;
	add(a,b);
	printf("&函数名 - %p\n",&add);
	printf(" 函数名 - %p\n",add);
	return 0;
}

编译运行结果如下 👇 

由此,证明了 函数名 == &函数名(完全等价)

那么指针所指向的类型就是函数返回值当中的类型。

当然,函数的地址也是可以取&出来,赋值给函数指针变量。

格式:函数返回值(*指针变量)(函数参数类型)

💥注意:这个函数指针变量是因为我们存放的地址是函数!

接着上面代码,示例,如下代码所示 👇

int (*ptr)(int,int) = &add;

这里的 ptr 就是函数指针变量。 

那么这里 ptr 相当于存放函数的地址,如果我对 ptr 进行解引用的话就相当于找到了函数的地址。而找到这个函数我们需要把 (*ptr) 用小括号给括起来。调用的时候进行传参,所以需要在后面给上。

示例,如下代码所示 👇

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int x,int y)
{
	return x + y;
}
int main(void)
{
	int (*ptr)(int, int) = &add;
	int ret = (*ptr)(3, 5);
	printf("ret = %d\n", ret); 
	return 0;
}

编译运行结果👉  ret  =  8

从上述代码中可以说明调用时✔的,木的问题。这个地方用的就是函数指针,用了一个函数指针去调用它所指向的函数。

int (*ptr)(int, int) = add;

当然,你这样子也是和上面是等价的。 

int ret = ptr(3, 5);

以及这样子也都是没有问题的,运行结果都是一样的。 

函数指针的应用

拓展示例如下👇

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。