函数指针数组
前言
今天参加了一笔试,笔试完事以后,一道函数指针数组如何定义的题目一直缠绕在我心头。回到宿舍,我请教了学习委员,他很耐心的解答了我的疑问,并且循循善诱,帮助我梳理了C语言当中数组指针、指针数组等几个容易混淆的概念。
在他的帮助下,我学习了很多,也把这些学习经验分享出来,供大家参考。
问题引入
请定义一个大小为10的数组a,其元素都是函数指针,函数类型为int func(int)
问题解答
第一个int是返回值,第二个(int)是参数
中间的 (*a [2])
就代表 a 是存放 2个指针变量的数组
指针数组和数组指针
C语言指针数组和数组指针_C语言中文网 (biancheng.net)
函数指针
函数指针及其定义和用法,C语言函数指针详解 (biancheng.net)
推广
int * p[10]
因为[]的优先级要比*的高
所以先确定 p 是数组,然后确定数组元素是指针
如果是 int (*p) [10]
因为括号提高了优先级,所以 * 先和 p 绑定
确定了 p 是指针,然后根据 int [10] 确定 p 指向的内容是存储了 10个int 型变量的数组
就看谁先跟这个 变量的名字 p 绑定上
先绑定上 p 就能决定 p 是什么个类型的变量
然后再根据其他修饰,来确定变量 p 存放的内容
综合应用
#include <stdio.h>
#include <malloc.h>
int func1(int a)
{
puts("a");
}
int func2(int a)
{
puts("b");
}
main()
{
int b[10]; // 普通int数组
int *p[10]; // 指针数组
int (*p1) [10]; // 数组指针
int (*a [2]) (int); // 函数指针数组
int i = 0;
p1 = malloc(sizeof(int)*10); // 初始化数组指针
a[0] = func1; // 为函数指针数组的每个元素赋值
a[1] = func2;
a[0](1);
a[1](2);
for (i = 0; i < 10; ++i) // 为普通int函数的每个元素赋值
b[i] = i;
for (i = 0; i < 10; ++i) // 为指针数组的每个元素赋值
p[i] = &b[i];
for (i = 0; i < 10; ++i)
printf("%d%c", *p[i], (i == 9 ? '
' : ' '));
for (i = 0; i < 10; ++i) // 为数组指针指向的数组的每个元素赋值
(*p1)[i] = *p[i];
for (i = 0; i < 10; ++i)
printf("%d%c", (*p1)[i], (i == 9 ? '
' : ' '));
}