理解:指针数组、数组指针、函数指针、函数指针数组、函数指针的数组的指针

清疚 2022-05-24 04:29 477阅读 0赞

一、指针数组

指针数组是数组还是指针?
答:指针数组是一个数组,该数组的所有元素都是指针类型数据。
举个栗子:
int * arr[10] (这就是一个指针数组,该数组有10个元素,每个元素类型为int *)

二、数组指针

数组指针是数组还是指针?
答:数组指针是一个指针,而这个指针是有能力指向一个数组的。
那数组指针是如何定义的呢?让我们来看一个例子:
int (* p)[10] (p先和*结合,说明p是一个指针变量,接着指针指向的是一个大小为10个整形的数组)
ps:这里要注意,[ ]的优先级高于* 的优先级,所以必须加上()来保证p先和 * 结合。

那么数组的地址是如何存储的呢?

  1. int arr[10] = {
  2. 0};
  3. int * p1 = &arr;//ok?
  4. //no!因为&arr是一个数组的地址,一维指针不能存放数组的地址;
  5. int (*p2) = &arr;//ok?
  6. //yes!数组指针用来存放数组的地址是合适的!

三、函数指针

函数指针的实质还是指针,指向某个函数的地址。

那么函数的地址要想保存起来,怎么保存?

  1. void test()
  2. {
  3. printf("hehe");
  4. }
  5. void (* pfun1)();
  6. void * pfun2();
  7. //pfun1和pfun2哪个有能力存放test函数的地址?
  8. //答案是:pfun1可以,因为pfun1为函数指针,可以存放一个函数的地址。

两个有趣的代码

  1. //代码1
  2. (*(void(*)())0)();
  3. //函数调用:将0强制转换为函数指针类型,解引用找到该函数,又调用该函数!
  4. //代码2
  5. void(*signal(int,void(*)(int)))(int);
  6. //函数声明:signal函数两个参数为int 和一个函数指针,且该函数返回类型为函数指针。

四、函数指针数组、函数指针数组

1、函数指针数组

数组是一个存放相同类型数据的集合,那要把函数的地址存到一个数组中,那这个数组就叫做函数指针数组。

那函数指针数组是如何定义的呢?

  1. int (*parr1[10])(); int *parr2[10](); int (*)() parr3[10];
  2. //答案是parr1,parr1先与[]结合,说明parr1是一个数组;
  3. 数组的内容是int (*)()类型的函数指针。

2、指向函数指针数组的指针

指向函数指针数组的指针是一个指针,指针指向了一个数组,这个数组中存放的是函数指针类型的元素。

那它是如何定义的呢?

  1. void(*(*ppfunarr)[10])(const char * )
  2. //指向函数指针数组的一个指针:
  3. //ppfunarr先和*结合,所以他是一个指针,
  4. //接着与[]结合,说明他指向一个数组,且这个数组为函数指针数组!

发表评论

表情:
评论列表 (有 0 条评论,477人围观)

还没有评论,来说两句吧...

相关阅读