“数组与指针”辨析:
在c语言中最容易被程序员所搞混的就是数组与指针的概念,简单点的一级指针、一维数组
还是比较好理解与记忆的,但较复杂的指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
等就相对而言比较难以被程序员所理解与记忆了!那么,小主今天就为大家详细的说道说道喽:》
指针数组:
指针数组是指:每一个元素都是一个指针变量的数组。 例如:
char *arr[20];//arr代表一个含有20个char *类型元素的数组。
数组指针:
数组指针是指:一个指向数组的指针变量。 例如:
int arr[20];//一个含有20个整形元素的数组arr.
int (*p)[20] = &arr;//因为()的优先级高于[],所以p先于*结合,代表p是一个指针
//它指向“int [20]”类型,int [20]为一个数组类型同arr,所以将p初始化为arr的地址
//也就是整个数组的地址。
函数指针:
函数指针是指:一个指向函数的指针。 例如:
void test(char *);//一个包含char *类型形参并且返回void的test函数。
void (*p)(char *) = &test;//p先于*结合表明p是一个指针,p所指向的类型void (char *)
//同teat函数
函数指针数组:
函数指针数组是指:每个元素都为同一类型函数指针的数组。 例如:
void test(char *);//一个包含char *类型形参并且返回void的test函数。
void (*arr[20])(char *) ;//arr先于[]结合,说明arr为一个数组,它的每个元素为
//void (*)(char *)类型的函数指针。
指向函数指针数组的指针:
指向函数指针数组的指针是指:一个指向数组的指针,这个数组每个元素的类型是一个函数指针。 例如:
void test(char *);//一个包含char *类型形参并且返回void的test函数。
void (*arr[20])(char *) ;//arr为一个数组,它的每个元素为void (*)(char *)
//类型的函数指针。
void (*(*p)[20])(char *);//p先于*结合说明p是个指针,它指向void (*[20])(char *)
//类型的数组。
总结:
- 在汉字中判断时,是指针还是数组只需看最后面两个字是指针还是数组即可。
- 在代码中判断时,首次需要判断变量名是先与
*
还是[]
结合,若先于*
结合便是指针,否则为数组。