指针进阶之函数

从计算器了解函数指针

#include<stdio.h>
void menu()
{
	printf("********************************************\n");
	printf("****  1.+            2.-       *************\n");
	printf("***** 3.*            4./       *************\n");
	printf("*****       0.exit  **************************\n");
	printf("********************************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int main()   //计算器
//{
//	int input = 0;
//	int x, y;
//	do
//	{
//		menu();
//		printf("请选择你要的运算:>\n");
//		scanf("%d", &input);
//	switch (input)
//		{
//		case 1:
//			printf("请输入你的两个操作数:>\n");
//			scanf("%d %d", &x, &y);
//			printf("%d\n", Add(x, y));
//			break;
//		case 2:
//			printf("请输入你的两个操作数:>\n");
//			scanf("%d %d", &x, &y);
//			printf("%d\n", Sub(x, y));
//			break;
//		case 3:
//			printf("请输入你的两个操作数:>\n");
//			scanf("%d %d", &x, &y);
//			printf("%d\n", Mul(x, y));
//			break;
//		case 4:
//			printf("请输入你的两个操作数:>\n");
//			scanf("%d %d", &x, &y);
//			printf("%d\n", Div(x, y));
//			break;
//		case 0:
//			printf("退出\n");
//			break;
//		default:
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}

函数指针,是指针,指向函数的指针,存放函数地址的指针(可以对比数组指针来思考)

函数里面 ,&函数名和函数名一样都是函数的地址,int(*pa)(intx,inty) 调用函数时(*pa)(2,3)(pa)(2,3)表示的函数调用一样,*pa=pa=函数名


(*(void(*)())0)()表示一个函数的调用,(void(*)())表示一个指针指向无形参不返回的函数

()强制类型抓换把0转换为那个指针,然后对0解引用,得到指针指向的函数在加()表示调用0指向的函数


void(*signal(int,void(*)(int)))(int)首先这是一个函数,里面的形参一个为整型,一个为函数指针类型,

把函数名形参去掉,得到函数的返回类型是,void(*)(int)返回类型是函数指针。

 typedf void(*pfun)(int);类型重命名把函数指针类型重命名为pfun   上面写成 pfun signal(int,pfun)

int(*pa)(int,int)是指针指向函数的指针函数形参是两个整型,返回类型是整型

/int main()
//{
//	int(*pa)(int, int) = Add;
//	printf("%d\n", pa(2, 3));
//	printf("%d\n", (*pa)(2, 3));//&函数名和函数名一样都是函数的地址,int(*pa)(intx,inty) 调用函数时(*pa)(2,3)(pa)(2,3)表示的函数调用一样,*pa=pa=函数名
//	int i = 0;
//	int(*parr[4])(int, int) = {Add,Sub,Mul,Div};//int(*pa[4])(int,int)表示的就是数组了,数组里面4个元素每个元素的类型是int(*)(int,int)函数指针,这是一个函数指针的数组
//	for ( i = 0; i < 4; i++)
//	{
//		printf("%d\n", parr[i](2, 3));
//	}
//	return 0;
//}
//char* my strcpy(char*dest,const char*src)写一个函数指针存放my_strcpy的地址,写一个数组,里面存放4个my_strcpy的地址
//char* (*p) (char*,char*)=my_strcpy;
//char* (*parr[4])(char*,char*)={my_strcpy,my_strcpy,my_strcpy,my_strcpy};

函数指针数组

int(*pa[4])(int,int)表示的就是数组了,数组里面4个元素每个元素的类型是int(*)(int,int)函数指针,这是一个函数指针的数组

 指向函数指针数组的指针    int(*parr[4])(int,int)这是一个函数指针数组,怎么取地址交给一个指针

int(*p)[10]这个一个数组指针,存放数组的地址,想,

 int(*(*pparr)[4])(int,int)=&parr   pparr是一个数组指针,指针指向4个元素,里面元素的类型是函数指针

void menu()
{
	printf("********************************************\n");
	printf("****  1.+            2.-       *************\n");
	printf("***** 3.*            4./       *************\n");
	printf("*****       0.exit  **************************\n");
	printf("********************************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int main()
{
	int input = 0;
     int x, y;
	 int (*parr[5])(int x, int y) = {0,Add,Sub,Mul,Div };
	 do
	 {
		 menu();
		 printf("请选择你要的运算:>\n");
		 scanf("%d", &input);
		if (input >= 1 && input <= 4)
		 {
			printf("请输入你的两个操作数:>\n");
			scanf("%d %d", &x, &y);
			 printf("%d\n", parr[input](x, y));
		 }
		 else if (input == 0)
		 {
			 printf("退出\n");
		 }
		 else
			 printf("选择错误\n");
	 } 	 while (input);
}

这是一个函数指针数组,数组里面存放的是函数指针,通过指针找到函数调用


上一篇:c语言指针自学


下一篇:堆排序算法