指针数组
指针数组是数组,是一个存放指针的数组
int * ptr_array[10]
char *arr2[4]
指针数组是数组元素为指针的数组,本质上是数组
- *p[2]
是数组指针,实质是数组,里面两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合形成数组p[2] 再与*结合,表示此数组是指针类型的,每个数组元素的相当于一个指针变量。
- 相比较二维数组,指针数组有明显的 优势的优点:一是指针数组中的每个元素的所指的字符串不必限制在在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标式要高。但是二维数组又可以通过下标很容易的修改某一个元素的值。
函数指针
函数指针是指向函数的指针变量,因此函数指针本身是一个指针变量
void test90
{
printf("hehe\n");
}
void (*arr)();
这个arr先于*结合形成指针,然后指针指向的是一个函数
#incliude<stdio.h>
int max(int x,int y) //函数
{
return (x>y?x:y);
}
int main()
{
int (*prt)(int,int); //定义函数
int a,b,c;
prt=max; //指向函数
scanf("%d%d",&a,&b);
c=(*prt)(a,b);调用函数
return 0;
}
函数指针数组
函数指针数组是一个其元素是函数指针(是指向函数入口地址)的数组
。
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.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 mydiv(int x, int y)
{
return x / y;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
char methodLable[5] = { '.', '+', '-', '*', '/' };
int(*p[5])(int, int) = { 0, add, sub, mul, mydiv };
while (input)
{
printf(" 终端小型计算器 \n");
printf("******************************\n");
printf("***1 add 2 sub********\n");
printf("***3 mul 4 div********\n");
printf("******* 0 exit *********\n");
printf("******************************\n");
printf("请输入运算和数字:");
scanf("%d", &input);
if ((input <= 4 && input >= 1))
{
printf("请输入要操作数的两个整数\n");
scanf("%d%d", &x, &y);
ret = p[input](x, y);
printf("%d %c %d=%d", x,methodLable[input],y, ret);
}
else
{
printf("你的输入有误请重新输入\n");
}
system("pause");
system("cls");
}
return 0;
- 上面的例子可以展现出函数数组指针的重要用途
转移表
。
指向函数指针数组的指针
只想函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
。
void(*p)(const char*) //函数指针arr
void(*parr[5])(const char* ) //函数指针数组arr
void(*(*pparr)[5])(const char*) //指向函数指针数组的指针