Fork me on GitHub

指针理解——复杂指针解析

右左法则

首先从最里面的圆括号看起,然后往右看,再往左看,每当遇到圆括号时,就应该调转阅读方向,一旦解析完圆括号里面的所有东西,就跳出圆括号,重复这个过程直到整个声明解析完毕。

举例:int * (* (*fun) (int *)) [10]

首先,fun是一个指针,因为他先跟*(绿色色)结合。fun指向的是一个函数,该函数特点是有一个整形指针做参数,并且返回值仍然是一个指针(品红色)。其返回值指针指向的内容是个数组。所指向的数组有10个元素,每个元素都是int *类型。

练习:

用变量a给出下面的定义
a)一个整型数
  int a;

b)一个指向整型数的指针
  int*a

c)一个指向指针的指针,它指向的指针是指向一个整型数

  int**a

d)一个有10个整型数的数组
  int a[l0]
e)一个有10个指针的数组,该指针是指向一个整型数的。
  int *a[l0]
f)一个指向有10个整型数数组的指针

  int(*a)[l0]
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数

  int(*a)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

  int(*a[l0])(int)

最后一个例子

(*(void(*)())0)()

假如有代码void(*pfun)()  我们很容易知道这是个函数指针。那么该函数指针的类型是void(*)()

接下来把0强制胡转换成void(*)()这种类型,就是(void(*pfun)())0去掉pfun,变成(void(*)())0。本来就是一个普通数字0,现在被强制转换成函数指针,摇身一变成某个函数的地址。

假如有代码void(*pfun)() ,pfun是个函数指针。取得该指针所指向的函数就能调用函数,即(*pfun)()

同理(void(*)())0这个函数指针,*取该指针指向的函数*((void(*)())0),但是要调用指向的函数,还要再阔上()。即(*(void(*)())0)()

posted @ 2018-07-22 21:20  克拉默与矩阵  阅读(433)  评论(0编辑  收藏  举报