C语言函数指针-创新互联

  • 函数指针
    • 代码示例
  • 函数指针数组
    • 示例:计算器
  • 指向函数指针数组的指针

成都创新互联公司长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为巴青企业提供专业的成都网站建设、网站建设,巴青网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。函数指针
//数组指针
int arr[10];
int(*p)[10] = &arr;
//函数指针
int Add(int x, int y);
int(*pf)(int, int) = &Add;
//int(*pf)(int, int) = Add;//该代码与上面的代码意义相同,即函数名就可以代表函数的地址
代码示例
( *( void (*)() ) 0 )();

0先与 (void(* )()) 结合,也就是说0先被强制类型转换为 void(* )() 的函数指针,然后又被解引用(* (void(* )())0) 就相当于使用在0地址处的类型为void(*)()的一个函数,而后面的那个括号本来就没有参数。

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

signal是变量名,signal先与后面的括号结合,表明signal是一个函数,括号内的内容表明该函数第一个参数的参数类型是int,第二个参数的参数类型是void(* )(int),该代码去掉signal(int, void(* )(int)),剩下的内容是void(*)(int),这部分内容是signal函数的返回类型。

//typedef unusigned int u_int
typedef void(*pf)(int);
pf signal(int, pf);

使用typedef将void(*)(int) 重定义为pf, 然后再用pf表示signal函数更加容易理解(注意重命名时的书写)

函数指针数组

存放函数指针的数组就是函数指针数组

//指针
int* p = NULL;
//指针数组
int* arr[5];
//函数指针
int(*pf)(int, int);
//函数指针数组
int(*pf[5])(int, int);

int(* pf[5])(int, int)中pf先与[]结合表明pf是一个数组,去掉pf[5]后的内容是该数组中的元素类型int(* )(int, int),也就是说该数组中存放的有5个类型为int(* )(int, int)的函数指针。

示例:计算器
#includevoid menu();
int Add(int, int);
int Sub(int, int);
int Mul(int, int);
int Div(int, int);

int main()
{int x = 0;
	int y = 0;
	int ret = 0;
	int input = 0;
	int(*pf[5])(int, int) = {NULL, Add, Sub, Mul, Div};
	do
	{menu();
		scanf("%d", &input);
		if (input<= 4 && input >= 1)
		{	printf("Enter two numbers: ");
			scanf("%d%d", &x, &y);

			ret = pf[input](x, y);
			printf("%d\n", ret);
		}
		else if (0 == input)
		{	printf("退出程序\n");
		}
		else
		{	printf("输入错误\n");
		}
		
	} while (input);
	return 0;
}
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;
}
void menu()
{printf("\n1.add  2.sub\n");
	printf("\n3.mul  4.div\n");
	printf("\n   0.exit\n");
}

该程序中的函数指针数组将调用的函数都存放到一个数组中,在使用的时候可以直接使用不同的下标来访问不同的函数。

指向函数指针数组的指针

指向函数指针数组的指针是一个指针,它指向了一个数组,该数组是函数指针数组。

//函数指针
int(*p)(int, int);
//函数指针数组
int(*pf[5])(int, int);
//指向函数指针数组的指针
int(*(*pff)[5])(int, int);

pff 先与 * 结合,表明 pff 是一个指针,去掉 ( * pff ) 之后,剩下的就是 pff 指向的类型,也就是 int( * [5])(int, int)。因为 pff 可以理解为对函数指针数组取地址,也就是 pff = &pf, * pff也就应该等价于 pf ,所以可以直接在函数指针数组 pf 的基础上得到指向函数指针数组的指针,也就是将 pf 直接改为 * pff ,再在 * pff 的外面加上括号。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:C语言函数指针-创新互联
本文链接:http://scyanting.com/article/ddhhse.html