1.指针数组
指针数组是数组,是一个存放指针的数组。
int *a[10]
因为’[ ]’的优先级高于’*’,所以上式是一个数组,一个含有10个元素的数组。元素的类型是int *型,所以上式是一个具有10个整形指针数组元素的数组。
2.数组指针
数组指针是指针。
int (*a)[10]
a先和*结合,说明a是一个指针变量,指向的是一个大小为10个整型的数组。所以a是一个指针,指向一个数组,叫数组指针。
3.函数指针
void (*pfun1)();
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。
例:
(*(void (*)())0)(); //函数声明
void (*signal(int , void(*)(int)))(int); //函数调用
4.函数指针数组
要把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
int (*parr1[10]])();
parr1 先和 [] 结合,说明parr1是数组,而数组的内容是 int (*)() 类型的函数指针。所以parr1就是一个函数指针数组。
例:函数指针数组实现简易计算器
#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;
}
5.指向函数指针数组的指针
指向函数指针数组的指针是一个指针。该指针指向一个数组,数组的元素都是函数指针。
例:
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
return 0;
}