在C语言中指针是个很重要的概念,指针可以做许多事情。
它还有一些高级应用,这篇文章将对指针数组
、数组指针
、函数指针
、函数指针数组
、函数指针数组
、指向函数指针数组的指针
这几个比较绕口、也比较容易混淆的概念进行详解。
指针数组
顾名思义,按照语文的理解方式来讲。指针数组
首先是一个数组,这个数组的每个成员都是指针类型。
数组指针
同样,数组指针
首先是一个指针,然后这个指针指向的是一个数组,指针指向什么类型,这个指针在+1时它的步长就是这个类型的大小(字节数)。
搭配一段代码食用:
int a[10]; //这是一个整型数组,它的每个元素都是int 类型的,数组名为a
int* a1[10]; //这是一个整型指针数组,它的每个元素都是(int *)类型的,数组名为a1
int (*a2)[10];//这是一个数组指针a2,这个指针可以指向的是一个有十个整型元素的数组,
//它的步长为sizeof(a)个字节,也就是说a2++这个操作指针会跳过40个字节
//这里,数组名必须跟*括起来,因为[]运算符的优先级高于*,不括起来
//的话数组名就会先和[]结合,那样它就会是一个"指针数组"了
a2 = &a; //让数组指针a2指向数组a
函数指针
每个函数都有它自己的地址,所以指针也是可以指向函数的,那么指向一个函数的指针就是函数指针。
函数指针和数组指针的定义方式很相像:
#include<stdio.h>
void fun()
{
printf("This is a function.\n");
}
int main()
{
void (*p)(); //定义一个函数指针p,这个函数指针可以指向返回值为void的无参函数
p = fun; //让函数指针p指向fun函数
fun(); //调用fun函数
p(); //调用指针p指向的函数
return 0;
}
运行结果:
可见,用函数指针也可以调用函数,结果是一样的。
注意:用函数指针调用函数时对指针进行解引用再调用和直接用指针调用结果是一样的。
即:p();调用和(*p)();结果一样,都可以成功调用。
函数指针数组
从这个概念的名称来看,可以这样解读:
首先这是一个数组,然后这个数组里面存的每一个元素都是指针,最后,这些指针都是指向函数的。
看代码:
int Max(int x,int y) //定义一个Max函数,有两个int 参数,返回值是int
{
return x>y?x:y;
}
int Min(int x,int y)
{
return x>y?y:x;
}
int main()
{
int (*pa[2])(int ,int ); //定义一个有两个元素的数组,数组的每一个元素都
//是指向有两个int 参数,返回值为int的函数指针
pa[0] = Max; //使函数指针pa[0]指向Max函数
pa[1] = Min; //使函数指针pa[1]指向Min函数
return 0;
}
这段代码中,pa是一个数组,它的每个参数都是一个函数指针,用不同的数组下标就可以调用不同的函数。
这也是函数指针数组重要的用途,可以在小幅度改动主函数的前提下向程序中添加新的功能模块。
指向函数指针数组的指针
这个概念看似很长很绕口,但是只要参考对指针数组
和数组指针
的理解来理解这个概念,就非常简单了。
数组指针
是指向数组的指针
那么函数指针数组指针
就是指向函数指针数组
的指针
- 首先,它是一个指针
- 然后,这个指针指向的是数组
- 再然后,这个数组里面存着的每个元素还是指针
最后,这些指针指向的都是函数
这样就把一个复杂的概念拆解开了,再参考上面的对
指针数组
和数组指针
的理解,很容易就可以知道这个“指向函数指针数组的指针”到底是个什么东西了。