一,常见指针
&
是取地址运算符,*
是间接运算符。
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 是一个参数为一个整数,且返回一个指向由整型指针变量组成的数组的指针变量的函数。