复杂声明
声明只是一个约定俗成的规则
它不一定符合自然语言的逻辑
看不懂声明一般是遇到了函数指针和数组的声明
其实int* b
这样写才是科学的,因为左边是类型,右边是变量名
但是复杂声明不太允许这样写,风 格不太统一
所以就有了int *b
这样的写法,它的意思是b=int*
int *b
、int *(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])()