也许读本科就没有搞清楚过指针,反正到现在也是糊的,决定写个笔记搞懂。下面以牛客一道例题说明。
例:用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数()
A.int *a[10];
B.int (*a)[10];
C.int (*a)(int);
D.int (*a[10])(int);
答案:D
原因如下:
int *a[10]; //指向int类型的指针数组a[10]
int (*a)[10]; //指向有10个int类型数组的指针a
int (*a)(int);//函数指针,指向有一个参数并且返回类型 均为int的函数
int (*a[10])(int); //函数指针的数组,指向有一个参数并且返回类型均为int的函数的数组
1. 定义一个数组
2. 该数组元素是指针
a[10]
2. 该数组元素是指针
*a[10]
3. 该指针指向一个函数,
(* a[10]) ()
4. 有一个整形参数
(* a[10]) (int)
5. 并返回一个整形数
int (* a[10]) (int)
例2:定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?
1. 定义一个函数指针
(*p)
2. 指向的函数有两个int参数
(*p) (int,int)
3. 返回值是一个函数指针
* (*p) (int,int) (* (*p) (int,int))
4. 返回的指针指向一个int参数
(* (*p) (int,int))(int)
5. 并返回 int
int (* (*p) (int,int))(int)
所以:int (* (*p) (int,int))(int)
相似的一个例子:声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()
1. 声明一个指针
(*p)
2. 该指针指向一个数组
(*p)[10]
3. 每个元素是一个函数指针
(*(*p)[10])()
4. 参数是int*
(*(*p)[10])(int*)
5. 返回值是int
int (*(*p)[10])(int*)
经典例子
注意: 指向数组的指针和指针数组
int *a[10]: a是一个数组,该数组的元素是指针,每个指针都指向一个int型
int (*a)[10]:a是一个指针,该指针指向一个数组,数组元素是int
例子1
int (*a[10])(int)
1. a是一个数组
2. a这个数组的元素是一个指针
3. 指针是一个函数指针
4. 这个函数参数是int,返回值是int
a是一个包含10个元素的数组,每个元素指向一个参数是int,返回值是int的函数。
例子2
int (*(*p)[10])(int*)
1. p是一个指针
2. p这个指针指向一个数组
3. 数组元素是指针
4. 数组元素的指针指向一个函数
5. 这个函数参数是int*,返回值是int
p是一个指向包含10个元素的数组的指针,每个元素是一个函数指针,指向一个参数是int*,返回值是int的函数。