对函数指针 函数指针数组 函数指针数组指针 指向函数指针数组的指针的理解

1.函数指针

什么是函数指针:是指针,有能力指向一个函数,既可以通过指针调用函数,亦可通过函数名直接表示。

接下来我们看张图:

在这里,你肯定会想函数名怎么会有地址,存在于哪里?

接下来,我们看两段代码:(1). char *(*fun1)(char *p1,char *p2)(2).(2) char * *fun2(char p1,char p2)

第一个看起来更像函数第一题看起来像函数,其实他是函数指针,fun1是指针变量,他指向一个函数。这个函数有两个指针类型的参数,返回值为 char * 型;第二题看起来像指针,其实他是一个函数,fun2是函数名,参数为两个指针,返回值为 char 型二级指针。

2.函数指针数组

什么是函数指针数组:是数组,这个数组中的元素就是我们前面所提到的函数指针。( 比如:char *(* a[4])(char *p);它是一个数组,数组名为 a ,数组内有四个指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。)

函数指针数组指针:首先它是一个指针,这个指针指向数组,这个数组里面存的都是指向函数的指针。(比如:char (*(* a)[4])(char *p); 这个指针指向包含了4个元素的数组;这个数组里面存的是指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。

用函数指针数组的实现:

#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
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 chu(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0,add,sub,mul,chu};//转移表
	while (input)
	{
		printf("******************************\n");
		printf("1:add                   2:sub \n");
		printf("3:mul                   4:chu \n");
		printf("******************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if (input <= 4 && input>=1)
		{
			printf("请输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret=%d\n", ret);
		}
		else
		{
			printf("输入错误\n");
			printf("ret=%d\n", ret);
		}
	}
	system("pause");
	return 0;
}

3.指向函数指针数组的指针

函数指针数组的指针:就是一个指针,该指针指向函数指针数组,这个数组里的元素是函数指针。

#include<stdio.h>
#include<windows.h>
void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	void (*pfun)(const char*) = test;//函数指针pfun
	void (*pfunarr[5])(const char* str);//函数指针数组pfunarr
	pfunarr[0] = test;
	void (*(*ppfunarr)[10])(const char*) = &pfunarr;//指向函数指针数组pfunarr的指针ppfunarr
	system("pause");
	return 0;
}

通过以上的了解 ,相信大家对指针的概念有了以下了解,在这里我还有以下建议:在分析指针还是数组之前,我们一定不要马虎,不要心急,弄清[ ]与*的结合性,从里到外一步步分析。这样能避免出错,让我们正确分析。

猜你喜欢

转载自blog.csdn.net/cdatreides/article/details/80427054