跳到主要内容

复杂声明

声明只是一个约定俗成的规则
它不一定符合自然语言的逻辑
看不懂声明一般是遇到了函数指针和数组的声明

其实int* b这样写才是科学的,因为左边是类型,右边是变量名
但是复杂声明不太允许这样写,风格不太统一
所以就有了int *b这样的写法,它的意思是b=int*

int *bint *(b)int (*b)都是指向 一个int类型的变量 的指针

函数指针声明

int (*func)()

这是格式,它的意思是func=int (*)()
即func是一个 返回类型为int的函数 的指针
第一个括号是为了把指针的声明塞进去
如果去掉括号,就变成了 函数声明 int func();

是的,这个就是你非要把函数写在最下面然后识别不到,最后要在文件最上面写的东西
实际上函数也是一种变量类型,叫函数类型

数组声明

int a[]

它的意思是a=int [],即为a是一个int型数组
(提醒一下,所有[]里面都需要写数组大小)

  • 指针的数组int *b[]
    • 等于int *(b[])int *(b)[]
    • 实为b=int*[]
  • 指向数组的指针int (*b)[]
    • x为变量名,(*x)表示"x是指向该空间的指针"
    • 也就是说除了int *b只有把*x直接括起来时才表示x是指针类型

区别在于*b[]有没有用()隔开

一个括号层内只有*而没有[]的话,可以把这层的子括号去掉,如(*(*b[]))=(**b[])

多维数组或者是指针套娃数组,反正无论是什么数组
层级都遵循从左到右从高到低
比如声明一个二维数组的.指针.数组
int (*b[])[][]
从右往左依次看就行,数组、二维数组、二维数组的指针数组这样

复合声明

让我们来看这位
int(*(*b[5]))()

  • 从右到左,括号从外到内
    • 右:函数
    • 左:指针、双重指针的数组(注意不是指针数组指针)

the 左 of 右:函数.的.双重指针.的.数组
可以简写为int (**b[])()
它把函数指针和数组的声明揉到一起了
它实际上是b=int()** [5]的意思

在复合声明中,函数指针声明永远在最底一层
也就是说b是一个数组,数组的元素是函数的双重指针

然后可以上上强度
如果要声明一个.二维数组的.指针数组.的指针,二维数组的第二层的元素是双重函数指针
那么应该这样写
int (**(*(*b)[5])[5][5])()

由内而外:

  • 指针
    • *b
  • 指针数组.的指针
    • *(*b)[5]
  • 双重指针的.二维数组的.指针数组.的指针
    • **(*(*b)[5])[5][5]
  • 双重函数指针.二维数组的.指针数组.的指针
    • (**(*(*b)[5])[5][5])()

由外而内:

此处的bx为子层级的指代

  • 双重函数指针的二维数组,bx=(*(*b)[5])
    • (**bx[5][5])()
  • .的指针,bx=(*b)[5]
    • (**(*bx)[5][5])()
  • 数组,bx=*b
    • (**(*bx[5])[5][5])()
  • .的指针
    • (**(*(*b)[5])[5][5])()