函数指针
函数指针是指向函数的指针,对比int指针,char指针,就知道指针前面的修饰词用来说明指针指向的对象的类型,指针的定义例如:
int (*fun) (int *);
这表示一个函数指针,其参数为int *, 返回值为int。
对于函数指针的定义语句,尤其要注意的是()不能少,指针符号*不能少。
返回指向函数的指针
函数可以返回指向函数的指针,那么该如何写呢?
首先我们写一个函数f(int),这代表是一个带有Int类型参数的函数。若f的返回值是一个带有Int形参的返回int类型的函数指针,
带有Int形参的返回int类型的函数指针可以写成;
int (*fun)(int)
于是,我们只要将fun替换成f(int)即可:
int (*f(int))(int)
数组指针
数组指针是一个指针(中文表述的特点要牢记:最后的称呼才是这个事物的本质,而前面的名词都是用来修饰的),它指向的是一个数组,那么该如何表示呢?
int (*p)[10];//表示一个指针指向一个包含10个元素的数组,其中每个元素都是int 类型
这时候或许你要问,为什么要加括号,因为[]的优先级高于(),如果不加,则首先和[]结合,那么就成了一个10个元素的数组,每一个元素是一个int *类型。
第一次看这些内容的时候,我也会觉得一头雾水,后来发现其实这样嵌套的指针如何判断只要由内而外替换即可。下面我们就拿一个经典的笔试题目来做一下:
1)一个整型数
int a;//这个很简单
2)一个指向整型数的指针
int *a;//这个很简单
3)一个指向指针的指针,它指向的指针是指向一个整型数
int **a;//这个很简单
4)一个有10个整型数的数组
int a[10];//这个很简单
5)一个具有10个指针的数组,该指针是指向一个整型数
int *a[10];//这个内容在之前解释过了,由于[]的优先级高于*,于是我们先看a[10],它的实质是一个10个元素的数组,那么剩下的int *就修饰这个数组,即元素是Int*l类型
6)一个指向10个整型数数组的指针
int (*a)[10];//首先我们知道这是一个指针,所以*a,那么指针指向的是一个10个int型元素数组,于是得到int (*a)[10]
7)一个指向函数的指针,该函数有一个整型参数并返回一个整型数
int (*a)(int);//首先这是一个指向函数的指针,那么原型是(*a)(),函数有一个整型参数,于是(*a)(int),该函数返回一个整型数,int (*a)(int)
8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
int (;//首先这是一个数组,a[10],其次,这个数组中的元素是指针,*a[10],然后指针指向一个函数(*a[10])(),这个函数有一个整型参数并返回一个整型数,即int (*a[10])(int);