首页 > 其他分享 >指针(三):函数指针

指针(三):函数指针

时间:2024-08-28 09:50:25浏览次数:12  
标签:return int ret printf input 函数指针 指针

目录

函数指针

函数的地址

函数指针,也就是存放函数地址的变量,有人会问,函数也会有地址吗?我们用一个代码来验证一下吧。

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

在这里插入图片描述

我们用&符号对函数取地址并以地址的形式打印,结果如图,很显然函数的确拥有自己的地址,并且函数名就是函数的地址。

函数指针结构

type (*p)(int,int);
 type:表示函数返回类型
(*p):表示p变量是一个指针
(int,int):表示函数的参数是俩个整型   

利用指针来调用函数:

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

	printf("%d\n", (*pf3)(2, 3));
	printf("%d\n", pf3(3, 5));
	return 0;
}

在这里插入图片描述

函数指针数组

了解函数指针数组

函数指针数组就是将函数的地址放在一个数组里面,通过访问数组的元素来访问函数,达到简洁代码的效果。

函数指针数组结构

int (*p[5])(int,int);
 type:表示函数返回类型
(*p[5]):表示p变量是一个指针数组,有5个元素
(int,int):表示函数的参数是俩个整型  

简易计算器

为了方便观看,就不用多文件来封装代码了。

#include<stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 0;
	int ret = 0;
	do
	{
		printf("*************************\n");//菜单
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);//选择计算模式
		switch (input)//对输入的数字进行模式选择
		{
		case 1:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}
	return 0;
}

可以看出来很简单的一个功能我们写了很长一段代码,接下来试着用函数指针数组的形式来优化。

函数指针数组优化计算器

#include<stdio.h>

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x = 0;
	int	y=0;
	int input = 0;
	int ret = 0;
	int (*p[5])(int, int) = {0,add,sub,mul,div};
	do
	{
		printf("*************************\n");//菜单
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);//选择计算模式
		if (input >= 1 && input <= 4)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (* p[input])(x, y);
			printf("%d\n",ret);
		}
		else if (input == 0)
		{
			printf("exit\n");
			break;
		}
		else
		{
			printf("输入错误,重新输入!");
		}
	} while (input);
	return 0;

return 0;
}

在这里插入图片描述
-------------------------分隔符
关于函数指针有关的内容就基本介绍完了,感谢观看。
有错请指正,共勉。

标签:return,int,ret,printf,input,函数指针,指针
From: https://blog.csdn.net/qq_71391318/article/details/141613720

相关文章

  • C++智能指针
    1.为什么需要智能指针大家来看下面这段程序我们new了两个arraydoubleDivision(inta,intb){ //当b==0时抛出异常 if(b==0) { throw"Divisionbyzerocondition!"; } return(double)a/(double)b;}voidFunc(){ int*array1=newint[10]; int*......
  • 深入理解指针(1)
    1.内存和地址1.1内存我们知道CPU(中央处理器)在处理数据的时候,需要的数据在内存中读取,处理后的数据也会放回内存中。那么如何提高内存空间的管理呢?其实也就是把内存分为一个个内存单元,每个内存单元的大小是一个字节,其中一个字节的大小相当于8个比特位(bit)。每一个内存单......
  • C++面试基础系列-this指针
    系列文章目录文章目录系列文章目录C++面试基础系列-this指针Overview1.this指针1.1.特性1.2.用法1.3.注意事项2.使用'this'指针的多态类的示例3.在C++中,指针和对象本身有什么区别?关于作者C++面试基础系列-this指针Overview1.this指针在C++中,this指针是一......
  • C++智能指针
    文章目录RAIIauto_ptrunique_ptrshare_ptrshared_ptr的线程安全问题shared_ptr循环引用weak_ptrRAIIRAII(ResourceAcquisitionIsInitialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接......
  • 算法:双指针
    题目:复写零虽然题目说必须要就地但是我们可以先试试异地然后再想办法优化成本地算法讲解:异地可以定义两个指针让它们分别指向本地和异地,当本地指针指向零时这时候就往异地写入两个零其余就照常写,说完异地做法那我们应该如何优化成就地做法呢?就地本地也要定义两个指针往......
  • 深入理解指针(下)
    1.数组名的理解首先分析下面这段代码intarr[10]={1,2,3,4,5,6,7,8,9,10};int*p=&arr[0];这里我们使用 &arr[0]的方式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,而且是数组首元素的地址,我们来做个测试。输出结果为我们发现......
  • 47.【C语言】指针(重难点)(J)
    目录26.自制排序函数(★★)    *分析    *代码往期推荐26.自制排序函数*分析之前在42.【C语言】冒泡排序写过一个排序函数,可以将此自制一个类似qsort的函数画圈的地方是需要修改的#include<stddef.h>voidbubble_sort(void*base,size_tnum,size_tw......
  • 前端宝典二十:高频算法之双指针、滑动窗口、二叉树
    一、前言学好算法的根基是:刷题!刷题!刷题!本文将深入探讨高频算法中的双指针、滑动窗口以及二叉树。题目均来源于https://leetcode.cn/。重点关注每种题目的解题思路和总结,通过详尽的解答,包括解答思路和每一步的代码实现,以帮助读者快速理解并掌握这些算法。二、双指针双指......
  • [C++] 初识 智能指针
    标题:[C++]初识智能指针@水墨不写bug目录一、前言二、智能指针1.什么是RAII?2.智能指针分类 三、智能指针简介1.std::auto_ptr2.std::unique_ptr3.std::shared_ptr正文开始:一、前言    C++智能指针的出现是有一定的背景的:    Java有专属......
  • C语言指针详解
    指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。2.指针的大小是固定的4/8个字节(32位平台/64位平台)。3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4.指针的运算1.字符指针在指针的类型中我们知道有一种指针类型......