在判断指针数组,数组指针,函数指针,指向函数指针数组的指针时,最重要的是先判断它本质到底是数组还是指针,那么问题来了,怎样判断是数组还是指针呢,其实在判断某一个之前,需要知道优先级的大小,优先级:( )>[ ]>*,如果变量名先与[ ]结合,就是数组,如若先与*结合,就为指针。
1.指针数组:它是数组,是一个存放指针的数组
int *arr1[10] ;char *arr2[4]; char **arr3[5],很明显,arr1,arr2,arr3都是先与[ ]相结合的,都属于指针数组。
2.数组指针:它是指针,是一个指向数组的指针
我们看一个简单的数组指针的定义:
int (*p) [10];//p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整形的数组,所以p是一个数组指针,这里要注意:[ ]的优先级是高于*的,所以必须加上( )来保证p和*先结合。
那数组的地址如何来存储?
int arr[10]={0};
int *p1=&arr;
int (*p2)[10]=&arr;
结果很明确,p2是比较合适的选择,p2是数组指针,所以存放数组的地址是合适的。
3.函数指针:它是指针,指向一个函数的地址
#include <stdio.h>
void test()
{
printf("Hello World!");
}
int main()
{
void (*pfun)()=test;
printf("%p\n",pfun);
printf("%p\n",test);
return 0;
}
注意函数名或者&函数名都表示函数的地址
pfun可以存放, pfun先和*结合。说明 pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。
4函数指针数组:是一个数组,存放函数的地址
pfun先和[ ]结合。说明pfun是数组,数组的内容是int(*)( )类型的函数指针。
#include <stdio.h>
int test()
{
printf("Hello World!");
}
int main()
{
int (*pfun[10])();
pfun[0]=&test;
printf("%p\n",pfun[0]);
printf("%p\n",test);
return 0;
}
5.指向函数指针数组的指针:它是一个指针,指针指向一个数组,数组的元素都是函数指针
#include <stdio.h>
void test()
{
printf("Hello World!");
}
int main()
{
//函数指针pfun
void (*pfun)()=test;
//函数指针的数组pfunArr
void (*pfunArr[5])();
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[10])()=&pfunArr;
pfunArr[0]=test;
printf("%p\n",test);
printf("%p\n",pfunArr[0]);
printf("%p\n",pfunArr);
printf("%p\n",ppfunArr);
return 0;
}