指针数组
指针数组是指针,是一个存放指针的数组。
//int *arr1[10]
数组指针
数组指针是指针;
我们已经知道:
整形指针:int* pint; 能够指向整型数据的指针。
浮点型指针:floar* pf; 能够指向浮点型的指针。
而数组指针是指针,这个指针是有能力指向一个数组的。
看一个简单的数组指针的定义:
int (*p) [10];
解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整形的数组,所以p是一个指针,指向一个数组,叫数组指针。
注意:[ ]的优先级是要高于*的,所以必须加上()来保证p和*先结合
数组指针的使用:
int (*p) [10] = &arr;
p是数组指针,用来存放数组的地址。
函数指针数组
数组是一个存放相同类型数据的存储空间,要把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
int (*arr[10])();
arr先和[ ]结合,说明arr是数组 ,数组的内容是int(*)()类型的函数指针。
函数指针数组的用途:转移表
例子:计算器
#include <stdio.h>
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 div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
switch (input)
{
case 1:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = add(x, y);
break;
case 2:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = sub(x, y);
break;
case 3:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = mul(x, y);
break;
case 4:
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = div(x, y);
break;
default:
printf( "选择错误\n" );
break;
}
printf( "ret = %d\n", ret);
}
return 0;
}
使用函数指针数组实现
#include <stdio.h>
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 div(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, div }; // 转移表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input < 4 && input > 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}
指向函数指针数组的指针
指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针。
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
// 函数指针 pfun
void (*pfun)(const char*) = test;
// 函数指针的数组 pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
// 指向函数指针数组 pfunArr 的指针 ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}