关于数组,指针和函数的问题,先提出一组名词
- 指针数组
- 数组指针
- 函数指针
- 函数指针数组
- 指向函数指针数组的指针
那么他们之间的联系和区别是什么呢,我们来一个个的分析:
1. 指针数组
指针数组:一个存放指针的数组,首先它是一个数组,而它里面的内容是一个个的指针,例如 :
int *p[5];
p是一个可以存放5个指向int型指针的数组,它的结构如图所示:
2.数组指针
数组指针:一个指向数组的指针,本身是一个指针,它的内容指向一个数组,例如:
int (*p)[5];
p是一个指向一维数组的指针,结构如图所示:
在这里要强调的是如何区分指针数组和数组指针,就看要运算符的优先级了,因为 [ ] 的优先级高于 * ,在 (int * p[5]) 中p先和 [ ] 结合,所以p是一个数组;相对的因为加上‘()’的(int (* p)[5])p先和 * 结合,因此p在这里是一个指针
3.函数指针
函数指针:一个可以指向函数的指针,例如:
void (*p)();
这里p是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void
关于函数指针的用法,例如:
int fun(int a,int b)
{
return a+b;
}
int (*p)(int, int) = fun;
这里我们定义了一个函数fun同时定义了一个函数指针指向fun,那么我们可以怎么调用呢:
(*p)(10, 20);
p(10, 20);
这两种调用方法都是可以的,其结果与直接调用fun(10, 20),结果一样。
4.函数指针数组
就如之前学习的指针数组一样,函数指针数组也是一个数组,只不过它里面的内容是一个个的函数指针,例如:
int (*p[5])()
p先和[ ]结合,说明p是一个数组,内容是 int (*)()类型的函数指针,结构如图:
5.指向函数指针数组的指针
顾名思义,他就是一个指针,而它指向的内容是一个函数指针数组,例如
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;
}
ppfunArr就是一个指向函数指针数组的指针,它的内容存放的是函数指针的数组pfunArr的地址,结构如下: