函数指针和指针函数

本文介绍了C语言中的函数指针与指针函数的概念及其应用。详细解释了如何定义和使用指针函数及函数指针,包括如何将函数指针作为参数传递,并展示了函数指针数组的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数指针和指针函数

#include"stdio.h"
//标题:函数指针和指针函数
//指针函数:返回指针的函数
//函数指针:指向函数的指针


//指针函数的定义
//函数声明:返回类型* 函数名(参数类型序列);
//函数定义:返回类型* 函数名(形似参数序列)
//{
//	函数体
//		return 返回指针类型量;
//}

//指针函数调用
//char *q
//q=函数名(实际参数列表);
//q与被调函数的返回类型一致


//指针函数1(返回类型为指针的函数)
char* getWord(char c)//返回的是字符类型指针
{
	switch (c)
	{
	case 'A':
		return "Apple";//返回的只是这个字符串常量的首地址
	case 'B':
		return "Banana";
	case 'C':
		return "Cat";
	case 'D':
		return "Dog";
	default:
		return "None";
	}
}
int main()
{
	char input;
	printf("please input a charactar:");
	input = getchar();
	printf("%c\n", input);
	printf("%s\n", getWord(input));//指针函数(返回指针的函数) 指针就是一个地址
	return 0;
}




//指针函数2
char *getWord(char c)
{
	char str1[] = "Apple";
	char str2[] = "Banana";
	char str3[] = "Cat";
	char str4[] = "Dog";
	char str5[] = "None";
//	//不要返回局部变量的指针(数组)
//	//在这个例子中,str1数组是局部变量,这个字符数组在程序结束后,它所对应的储存空间会被释放
//	//即使找到原来那个地址 它也已经不是原来的地址了
	switch (c)
	{
	case 'A':
		return str1;
	case 'B':
		return str2;
	case 'C':
		return str3;
	case 'D':
		return str4;
	default:
		return str5;
	}
}
int main()
{
	char input;
	printf("please input a charactar:");
	input = getchar();
	printf("%c\n", input);
	printf("%s\n", getWord(input));
	return 0;
}




//2函数指针(指向函数的指针)
//函数指针的定义和调用
//函数指针定义
//函数返回类型名(*指针变量名)(函数形参类型列表);
//int (*fptr)(int,int);
//函数指针的使用
//1.指针变量名=被指向函数名;
//fptr=maxx;
//2.函数的调用:指针变量名(函数调用时的实际参参数);
//int x=fptr(5,8);




//2(函数指针)指向函数的指针
//Linux操作系统的源代码中有大量的使用函数指针 函数指针比较灵活

//函数名等价于函数的地址.
//通过sp=square;语句使得fp指向函数的入口
//因此通过fp指针就能找到函数square的代码存放在哪里
//从而调用并执行这段代码
int square(int num)
{
	return num*num;
}
int main()
{
	int num;
	int(*fp)(int);
	printf("please input a number:");
	scanf("%d", &num);
	fp = square;//fp保存square函数的入口地址
	printf("fp=0x%x,%d\n", fp, (*fp)(num));//(*fp)取fp的内容 就是调用square函数
	printf("fp=0x%x,%d\n",fp,fp(num));//这个也可以用  可以跟数组类比
	return 0;
}


//函数指针作为参数进行传递
int add(int num1, int num2)
{
	return num1 + num2;
}
int sub(int num1, int num2)
{
	return num1 - num2;
}
int calculate(int(*fp)(int, int), int num1, int num2)//fp函数指针只能指向含有两个参数并且返回类型为整数类型的函数
{
	return (*fp)(num1, num2);
}
int main()
{
	printf("3+5=%d\n", calculate(add, 3, 5));
	printf("3-5=%d\n", calculate(sub, 3, 5));
	return 0;
}


//函数指针(指向函数的指针)
//定义一个函数指针数组
void function1(int);
void function2(int);
void function3(int);
int main()
{
	void(*f[3])(int) = { function1, function2, function3 };
	int choice;
	printf("输入一个数字:范围0—2:");
	scanf("%d", &choice);
	while (choice >= 0 && choice < 3)
	{
		(*f[choice])(choice);
		printf("输入一个数字:范围0—2:");
		scanf("%d", &choice);
	}
	printf("程序运行结果。");
	return 0;
}
void function1(int choice)
{
	printf("输入了%d,运行了function1函数。\n", choice);
}
void function2(int choice)
{
	printf("输入了%d,运行了function2函数。\n", choice);
}
void function3(int choice)
{
	printf("输入了%d,运行了function函数。\n", choice);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彭就是我的姓i

你的鼓励是我创作的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值