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