C语言基础——指针(5)
一. 函数指针变量
1. 函数指针变量的定义:
类比数组指针变量,数组指针变量是存放数组地址的变量,那么同理,函数指针变量就是存放函数地址的变量。
2. 创建函数指针变量:
函数是有地址的,函数名就是函数的地址。此外,&函数名也是函数的地址,二者本质上一样,因此,它们的地址也一样。
我们如果想将函数的地址存放起来,就需要创建函数指针变量了,以下是函数指针变量的创建方式(以上图函数为例):
int (* p)(int x,int y)=plus;
对函数指针变量创建的理解,和对数组指针变量的理解是相似的:
P是一个变量,那么(*p)意思是这个变量是个指针变量;在括号中的(int x,int y)表示p这个指针变量指向的参数的类型和参数的个数。要注意的是,在这里写下x,y和不写都是可以的,只要表明参数的个数和类型就行;最后,最前面的int表示这个函数指针变量指向的返回类型是int类型的。
3. 函数指针变量的使用:
我们通过创建一个加法函数来学习函数指针变量的使用:
int plus(int x, int y)
{
return x + y;
}
int main()
{
int x = 0; int y = 0;
printf("请输入两个数");
scanf("%d %d", &x, &y);
int (*p)(int x, int y) = plus;//创建一个函数指针变量来存放plus这个函数
printf("%d", (*p)(x, y));
return 0;
}
对于(*p)(x, y)这行代码,我们可以这么理解:
通过函数指针p调用指向的函数,并将x和y作为参数传给该函数。
二. typedef关键字
在C语言中,很多时候有很多类型比较长,这时候,如果我们想将这些类型简化,就需要使用typedef关键字,以下是它的基本使用方法(以
unsigned int 为例)
typedef unsigned int uint;
这样,在之后敲写代码的时候,就可以用uint 来代替了。
注:对于数组指针和函数指针要命名时,方法稍有不同:
数组指针:eg: typedef int(* name)[8]
函数指针:eg: typedef int(* name)(int x,int y)
三. 函数指针数组
按照之前所说的理解方式,我们重点关注最后两个字:数组;所以,函数指针数组是存放函数指针变量的数组,下面,我们通过创建一个简单的计算器来学习函数指针数组的应用。
创建简单计算器的基本步骤:
(1)创建四个函数,分别可以进行加减乘除的运算
(2)创建一个菜单,表示计算器的开始界面
(3)让读者选择是否开始使用计算器
(4)让读者选择要使用的计算方法
(5)让读者输入要计算的数
(6)计算结果并给出答案
函数指针数组的创建和使用和函数指针变量类似,以下是其创建和使用格式:
创建:int (*p[5])(int x, int y)
由于[ ]的计算等级比*高,所以p先和[ ]结合,意味着p是一个数组;其再和*结合,意味着这是一个指针数组,而这个指针数组中存放的就是一个或多个函数的地址。这样也就意味着,所有存放的函数的参数和返回值必须是一样的,这样函数指针数组才可以使用。
使用:(*p[input])(x, y)
*p[input]的意思是指向这个函数指针数组中选择的input中的函数,用(x,y)将其赋值,并使用这个函数。
以下是参考代码:
int first(int x, int y)
{
return x + y;
}
int second(int x,int y)
{
return x - y;
}
int third(int x, int y)
{
return x * y;
}
int forth(int x, int y)
{
return x / y;
}
void menu(void)
{
printf("******************************\n");
printf("**********0.退出 ************\n");
printf("**********1.加法 ************\n");
printf("**********2.减法 ************\n");
printf("**********3.乘法 ************\n");
printf("**********4.除法 ************\n");
printf("******************************\n");
}
int main()
{
int input = 0;//选择数
int x = 0;
int y = 0;//要计算的数
//创建一个函数指针数组来存放函数指针变量
int (*p[5])(int x, int y) = { 0,&first,&second,&third,&forth };
int a = 0;//创建一个数来接收函数传过来的变量,便于理解和打印
do
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input <= 4 && input >= 1)
{
printf("请输入要计算的数\n");
scanf("%d %d", &x, &y);
a = (*p[input])(x, y);
printf("计算结果是%d\n", a);
}
else if (input == 0)
{
printf("退出计算器\n");
}
else
{
printf("选择错误,请重新选择\n");
}
} while (input);
return 0;
}
四. 几个基本概念的辨别
数组指针:是指针,里面存的是数组的地址
指针数组:是数组,里面存的是一个或多个指针(地址)
函数指针:是指针,里面存的是一个函数的地址
函数指针数组:是数组,里面存的是一个或多个函数的地址
数组指针:
创建:int (*p)[5]=&arr
使用:(*p)[想找的数组的下标数]
指针数组:
创建:int *arr[3]={arr1,arr2,arr3}
使用:arr[arr中数组的下标][arr 1/2/3中数组的下标]
函数指针:
创建:int (*p)(int x,int y)=&函数名;
使用:(*p)(x,y)
函数指针数组:
创建:int(*p[5])(int x,int y)={&函数名1,&函数名2}
使用:(*p[想找的函数名的下标])(x,y)