一,常见指针
& 是取地址运算符,* 是间接运算符。
1,int p;
整型变量,32位CPU的话,占有32个bite。
2,int *p;
整型指针变量,用于存放一个整型变量的地址。
解析:
从 p 处开始,先与 * 结合,所以说明 p 是一个指针, 然后再与 int 结合, 说明指针所指向的内容的类型为 int 型。
3,int p[3];
整型数据组成的数组。
解析:
首先从 p 处开始,先与 [] 结合,说明 p 是一个数组, 然后与 int 结合, 说明数组里的元素是整型的, 所以 p 是一个由整型数据组成的数组。
4,int *p[3];
这是一个数组,该数组里面的成员是整型的指针,分别指向 int 型的内存。
解析:
首先从 p 处开始, 先与 [] 结合,因为其优先级比 * 高,所以 p 是一个数组, 然后再与 * 结合, 说明数组里的元素是指针类型, 然后再与 int 结合, 说明指针所指向的内容的类型是整型。

5,int (*p)[3];
这是一个指针,指向一个 int 型数组,地址类型是int [3]型。
解析:
首先从 p 处开始, 先与 * 结合,说明 p 是一个指针然后,再与 [] 结合(与 () 这步可以忽略,只是为了改变优先级), 说明指针所指向的内容是一个数组, 然后再与 int 结合, 说明数组里的元素是整型的。

6,int **p;
这是一个整型指针变量,用于存放一个整型变量的地址,
解析:
首先从 p 开始, 先与 * 结合, 说是 p 是一个指针, 然后再与 * 结合, 说明指针所指向的元素是指针, 然后再与 int 结合, 说明该指针所指向的元素是整型数据。
7,int p(int);
这是一个函数,函数的返回值是一个整型数据。
解析:
从 p 处起,先与 () 结合, 说明 p 是一个函数, 然后进入 () 里分析, 说明该函数有一个整型变量的参数, 然后再与外面的 int 结合, 说明函数的返回值是一个整型数据。
8,void *p(int);
这是一个函数,函数的参数是 int,返回值是 void *。
9,int (*p)(int);
这是一个指针,指向一个函数,该函数形参是 int,返回值是 int。
解析:
从 p 处开始, 先与指针结合, 说明 p 是一个指针, 然后与 () 结合, 说明指针指向的是一个函数, 然后再与 () 里的 int 结合, 说明函数有一个 int 型的参数, 再与最外层的 int 结合, 说明函数的返回类型是整型。
10,int (*p[3])(int);
解析:
- p 先和
[3]结合,说明 p 是一个数组;
p[3] 外面 * 结合,所以数组元素是一个指针;
- 假定
(*p[3]) 是 X,外面是 int (X)(int),所以指针是指向函数,函数的形参是 int 型,返回值是 int 型。

11,int *(*p(int))[3];
解析:
从 p 开始,先与 () 结合, 说明 p 是一个函数, 然后进入 () 里面,与 int 结合, 说明函数有一个整型变量参数, 然后再与外面的 * 结合, 说明函数返回的是一个指针, 然后到最外面一层, 先与 [] 结合, 说明返回的指针指向的是一个数组, 然后再与 * 结合, 说明数组里的元素是指针, 然后再与 int 结合, 说明指针指向的内容是整型数据。
所以 p 是一个参数为一个整数,且返回一个指向由整型指针变量组成的数组的指针变量的函数。