1,指针数组
指针数组,其本质还是数组,只不过它里面放的是指针。
//ep
char* p[3] = {"aaa","bbb","ccc"};
//首先,p是一个指针,指向有三个元素的数组,而每个元素又分别是一个指针,指向一个字符串。
2,数组指针
数组指针,其本质是一个指针,只不过它有能力指向一个数组。
//ep
char (*p)[3] = {'a','b','c'};
首先,*和p结合,它是一个指针,有能力指向又三个元素的数组,每个元素是字符类型。
接下来我们分析一段复杂的代码
//ep
int (*p[10])[5]
//p是一个指针,指向有10个元素的数组,每个元素里面有5个整形。
在写代码时,难免要把数组作为参数传给函数,在二维数组传参时,第一个方框的值可以省略,第二个方框的值不可以省略,
3,函数指针数组
首先,我们看一段代码;
void test()
{
;
}
int main()
{
printf("%p\n",test);
printf("%p\n",&test);
return 0;
}
通过输出结果我们可以发现,函数也是有地址的,可以通过取地址的方式拿出函数的地址。
如果想把函数的地址保存起来,应该怎样保存呢。
//ep
void (*test)();
//首先,*和test结合,说明*test是一个指针,在向外看,有括号,括号里面是空的,说明函数没有参数,然后函数的返回类型时void
要把函数的地址拿出来放在一个数组里面,这个数组就被称为函数指针数组。
//ep
void (*test[10]) ();
//首先test和[]结合,说明test[]是一个数组,那数组的元素是什么呢,数组的元素时void (*)()类型的函数指针。
函数指针数组用途:转移表
举例:计算器
常规写法
#include<stdio.h>
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 x = 0;
int y = 0;
int ret = 0;
int input = 1;
while(input)
{
printf("***1,add***********\n");
printf("***2,sub***********\n");
printf("***3,mul***********\n");
printf("***4,div***********\n");
printf("***0,exit**********\n");
printf("请输入");
scanf("%d",&input);
switch(input)
{
case 1:
printf("请输入俩个操作数:>\n");
scanf("%d %d",&x,&y);
ret = add(x,y);
break;
case 2:
printf("请输入俩个操作数:>\n");
scanf("%d %d",&x,&y);
ret = sub(x,y);
break;
case 3:
printf("请输入俩个操作数:>\n");
scanf("%d %d",&x,&y);
ret = mul(x,y);
break;
case 4:
printf("请输入俩个操作数:>\n");
scanf("%d %d",&x,&y);
ret = div(x,y);
break;
default:
printf("输入错误\n");
break;
}
printf("%d\n",ret);
}
return 0;
}
使用函数指针
#include<stdio.h>
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 x = 0;
int y = 0;
int ret = 0;
int input = 1;
int(*CAL[5])(int x,int y) = {0,add,sub,mul,div};
while(input)
{
printf("****1.add******\n");
printf("****2,sub******\n");
printf("****3,mul******\n");
printf("****4,div******\n");
printf("****0,exit*****\n");
printf("请选择");
scanf("%d",input);
if(input>=1 && input<=4)
{
printf("请输入两个数;\n");
scanf("%d %d",&x,&y);
ret = (*CAL[input])(x,y);
}
else
printf("输入有错误");
printf("%d",ret);
}
return 0;
}
4,函数指针数组的指针
int *test (); //函数指针
int (*trst[3]) (); //函数指针数组
int (*(*test[3])) (); //函数指针数组的指针
//test是一个指针指向一个有三个元素的数组,数组的每个元素都是一个函数指针。