【C基础】深度剖析 指针、数组、函数
如何区分指针数组、数组指针、函数指针以及指针函数呢?
其实很简单,就是看它的落脚点在哪,看它是数组还是指针还是函数
一、指针数组
指针数组:强调的是数组,保存指针的数组,每个元素的类型是指针
实例: int* arr[3]
解释: arr数组,该数组有3个元素,每个元素的类型是int*。
二、数组指针
数组指针:是指针,指向数组的指针,存放数组首元素的地址
实例: int (*arr)[5]
解释: arr
先和*
结合,说明arr
是一个指针变量,然后指向的是一个大小为5的整型数组。所以arr是一个指针,指向一个有5个元素的整型数组。
注意: []
的优先级要高于*
号的,所以必须加上()
来保证arr先和*
结合。(优先级()
>[]
>*
)。
数组名是数组首元素的地址。(有两个例外)
[1] sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
[2] &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
三、函数指针
函数指针:是指针,指向函数的指针,存放这个函数的地址
实例:****int (*pfun) (int, int)
解释:pfun
先与*
结合是指针,指向一个返回值是整型并且有两个整形参数的函数。
四、指针函数
指针函数:是函数,返回指针的函数
实例: int* pfun(int, int)
解释:pfun
是函数,是返回 int*
的指针函数。
五、C陷阱与缺陷
在《C陷阱与缺陷》这本书中有两段这样的代码:
//代码1
(*(void (*)())0)();
//代码2
void (*signal(int,void(*)(int)))(int);
六、小试牛刀
6.1 用变量a给出下面的定义
- 一个整型数。
int a;
- 一个指向整数型的指针。
int* a;
- 一个指向指针的指针,它指向的指针是指向一个整型数。
int** a;
- 一个有10个整型数的数组。
int a[10];
- 一个有10个指针的数组,每个指针是指向一个整型数的。
指针数组 int* a[10];
- 一个指向有10个整型数的数组的指针。
数组指针 int (*a)[10];
- 一个指向函数的指针,该指针有一个整型参数并返回一个整型数。
函数指针 int (*a)(int)
- 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。
int (* a[10]) (int)
6.2 分析下面几个类型的定义
int(* func) (int *, int(*)(int*));
分析:函数指针。定义了一个指针,该指针指向一个函数,该函数有两个参数,一个是整型指针,一个是函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)
int(*func[5])(int *);
分析:函数指针数组。定义了一个数组,该数组有5个元素,每个元素的类型是函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)
int(*(*func)[5])(int *);
分析:函数指针数组的指针。定义了一个数组指针,该数组有5个元素,每个元素是一个函数指针(该指针指向的函数有一个整型指针的参数和整型的返回值)
int(*(*func)(int *))[5];
分析:数组函数的指针。定义了一个函数指针,该指针指向的函数有一个整型指针的参数和一个数组指针的返回值(该指针指向的数组有5个整型元素 )
int*(*func(int *))[5];
分析:数组指针函数。定义了一个函数,该函数有一个整形指针的参数和一个数组指针的返回值(该指针指向的数组有5个整型指针元素)
int*(*(*func)(int *))[10];
分析:数组指针函数的指针。定义了一个函数指针,该指针指向的函数有一个整型指针的参数和一个数组指针的返回值(该指针指向的数组有10个整型指针元素)