1、[]与()的优先级相同,自左向右结合
2、[]与()的优先级大于*
3、[]里面的数字,不能省!即便有多维,也不能省略里面的数字,并且必须和“源”完全一致
typedef int T[8] | 一个数组,长度为8的数组,类型为int |
typedef int T() | 一个函数,返回值为int |
typedef int *T[8] | 一个数组,长度为8,保存内容为int型指针 |
typedef int (*T)[8] | 一个指针,指向一个数组,数组长度为8,数组内容为int类型 |
typedef int (*T)() | 一个指针,指向一个函数,函数返回值为int类型 |
typedef int (*T[8])() | 一个指针,指向一个数组,数组长度为8,数组类型为指针,指向一个函数,函数返回值为int |
实际,最主要的是两个:typedef int (*t)[8]; 和typedef int (*t)(),这俩分别表示指向一个数组和指向一个函数
“指向一个数组的指针”,即数组指针,它的“元素”是一个数组,则,当指向数组的指针+1时,跳转的不是数组里一个元素的大小,而是指向的整个数组的大小。
例如:
int a[5][8];
int b[8];
int (*p)[8] = a;
int **q = a;
p++,跳转的大小是sizeof(int)*8,而q++跳转大小是sizeof(int)。
来个例子:typedef int *(*(*T)[8])(int, int);
*T | 一个指针 |
(*T)[8] | 指针指向一个长度为8的数组([]的优先级高于*,因为需要将*T括起来) |
*(*T)[8] | 这个数组的内容是指针 |
int *( *(*T[8]) )(int, int) | 指针指向的是返回值为int类型的指针,参数为(int, int) |
从括号内到括号外,依次扩展,并参照[],()和*的优先级。
先看后面代表的是什么,再看前面是啥类型。