1.首先应明确指针数组和数组指针的区别!
指针数组:int *p1[n]; 本质是一个数组,这个数组每个元素是 int 型的指针类型
(优先级使p先和[n]结合说明这是一个数组,再和*结合)
数组指针:int (*p2)[n]; 本质是一个指针,这个指针指向这个数组
(p首先和 *结合,说明这是一个指针,再和[n]结合)
2.如何定义一个指向数组指针的指针?
如果清楚了数组指针其实是一个指针,如果再定义一个指向这个指针的指针,其实就是一个二级指针
即 int (**s1)[n] = &p2;
推导过程:p2的类型为 type = int (*)[n]; 即就是定义一个type 类型的指针
type * => int (**)[n];
白话解释:首先它是一个指针(*s1),这个指针指向一个指针,所以本质(即指针)优先和变量名结合, (**s1),这个指针的指针指向一个数组,
故为:(**s1)[n];
3.如何定义一个指向指针数组的指针?
指针数组就是一个数组 ,根2一样其p1 的类型为:int *[n]
即:int *(*s2)[n] = &p1;
推导过程:首先他是一个指针(*s2),它又是一个指向指针数组的指针,第二个本质是数组,那么首先和数组[]类型结合,即:(*s2)[],随后他是一个存放指针的数组:即为:*(*s2)[]
注意:若是指针,需用括号将变量名和*阔在一起(*s1),如果不阔上,会优先结合[ ],这样本质上就是数组不是指针了
总结一句:弄清本质,即到底是一个指针还是数组,那么本质就先和变量名结合