从变量名开始看,一步步往外分析。
1. int *p1;
定义了一个变量 p1
,前面的 *
表示 p1
是一个指针,指向什么?指向一个 int
类型的数据。
2. int *p2[5];
从变量名看,定义了一个变量 p2
。注意, []
的优先级比 *
高,所以 p2
是一个数组。数组的每个元素是什么类型?前面的 *
表示每个元素都是指针。指向什么?指向一个 int
类型的数据。
3. int (*p3)[5];
从变量名看,定义了一个变量 p3
。因为用 ()
改变了优先级,所以先看 *
, *
表示 p3
是一个指针。指向什么?注意,表示数组的 int [5]
也是一种类型,所以 p3
是一个二维数组指针。(一维数组指针指向的是数组的第0个元素。二维数组同理,指针指向的是二维数组的第0个元素,也即一个一维数组)
4. int *p4(int, int);
这不是指针,这是声明了一个函数 p4()
。返回值是指向 int
类型的指针,参数是 int, int
。
5. int (*p5)(int, int);
从变量名看, p5
是一个指针,后面的 ()
是函数参数,所以 p5
是一个函数指针。函数的返回值是 int
,参数是 int, int
。
6. int *(*p6)(int, int);
p6
和 p5
大致相同,除了指向的函数的返回值是 int *
(指向 int
类型的指针)。或者你也可以理解为 p6
是指向 p4()
函数的函数指针。
7. int *(*p7[5])(int, int);
p7
是一个指针数组,每个元素都是和 p6
一样的函数指针。