理解:指针数组、数组指针、函数指针、函数指针数组、函数指针的数组的指针
一、指针数组
指针数组是数组还是指针?
答:指针数组是一个数组,该数组的所有元素都是指针类型数据。
举个栗子:
int * arr[10] (这就是一个指针数组,该数组有10个元素,每个元素类型为int *)
二、数组指针
数组指针是数组还是指针?
答:数组指针是一个指针,而这个指针是有能力指向一个数组的。
那数组指针是如何定义的呢?让我们来看一个例子:
int (* p)[10] (p先和*结合,说明p是一个指针变量,接着指针指向的是一个大小为10个整形的数组)
ps:这里要注意,[ ]的优先级高于* 的优先级,所以必须加上()来保证p先和 * 结合。
那么数组的地址是如何存储的呢?
int arr[10] = {
0};
int * p1 = &arr;//ok?
//no!因为&arr是一个数组的地址,一维指针不能存放数组的地址;
int (*p2) = &arr;//ok?
//yes!数组指针用来存放数组的地址是合适的!
三、函数指针
函数指针的实质还是指针,指向某个函数的地址。
那么函数的地址要想保存起来,怎么保存?
void test()
{
printf("hehe");
}
void (* pfun1)();
void * pfun2();
//pfun1和pfun2哪个有能力存放test函数的地址?
//答案是:pfun1可以,因为pfun1为函数指针,可以存放一个函数的地址。
两个有趣的代码
//代码1
(*(void(*)())0)();
//函数调用:将0强制转换为函数指针类型,解引用找到该函数,又调用该函数!
//代码2
void(*signal(int,void(*)(int)))(int);
//函数声明:signal函数两个参数为int 和一个函数指针,且该函数返回类型为函数指针。
四、函数指针数组、函数指针数组
1、函数指针数组
数组是一个存放相同类型数据的集合,那要把函数的地址存到一个数组中,那这个数组就叫做函数指针数组。
那函数指针数组是如何定义的呢?
int (*parr1[10])(); int *parr2[10](); int (*)() parr3[10];
//答案是parr1,parr1先与[]结合,说明parr1是一个数组;
数组的内容是int (*)()类型的函数指针。
2、指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向了一个数组,这个数组中存放的是函数指针类型的元素。
那它是如何定义的呢?
void(*(*ppfunarr)[10])(const char * )
//指向函数指针数组的一个指针:
//ppfunarr先和*结合,所以他是一个指针,
//接着与[]结合,说明他指向一个数组,且这个数组为函数指针数组!
还没有评论,来说两句吧...