今天我们来聊一聊,那一些特殊的指针。
1.指针数组和数组指针。
我们先来看下面两个语句:
int *p[10]; (1) int (*p)[10]; (2)
这个时候我们需要引入一个很重要的东西——运算符优先级表。
不难看出,“ [] ”优先级高于“ * ”,不难得出结论语句(1)中p先和“ [] ”结合,语句(2)中p因为()的存在,先和" * "结合,所以可以得出,语句(1)指的是指针数组,顾名思义,即存放指针的数组,而语句(2)是数组指针,即一个有能力指向一个数组的指针。
2.函数指针。
接下来我们来看下面两个语句:
void (*pfun1)(); (1) void *pfun2(); (2)
我们对于语句(2)应该很熟悉,这就是一个返回值为void*类型的函数,而对于语句(1),就又要用到我们的运算符优先级表了,语句(1)中p先与“ * ”结合,所以语句(1)是一个指针,而且他指向一个没有参数的函数,返回值类型为void。
3.函数指针数组
最后我们要讲一下函数指针数组,看下面代码:
int (*parr[10])();
根据优先级,parr先和" [] "结合,所以该语句是一个数组,然后parr[]与“ * ”结合,所以数组里的内容是指针,而且是函数指针。
函数指针数组用途有:计算器。具体在这里也不举例了。
4.总结
讲了这些,我们就需要提一下,我们在区分一个变量是函数还是指针还是数组的时候,最需要用到的一个工具——运算符优先级表。有了这东西,我们将来遇到数组指针,指针数组,函数指针,函数指针数组,甚至指向函数指针数组的指针的时候,也可以很好的看出其类型。
感谢审阅。