相信很多人和我一样,有着这样的恐惧,那就是这四个玩意怎么也分不清,这都是啥啥啥啥呢?今天我们来具体分析一下。其实要具体了解这四个概念,只需要了解符号优先级,并关注最后两字,你就成功了一半。
符号优先级
在一个表达式中可能包含多个不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现运算错误。所以表达式必须按一定的顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。所以请牢牢记住下面三个符号的优先级判断,这对今天理解这四个概念,十分重要!
(内) > [ ] > *
指针数组
指针数组:一个数组,数组的元素是一个指针!
常用形式:类型 *变量[长度]
int *p1[10];
/*
由于[]的优先级比*更高
p1表示一个10个元素的数组
int* 表示元素是一个指向int的指针
即:p1[0],p1[1]...各自装着一个int指针
*/
指针数组比较容易理解,就是一个数组,里面装的是指针!
数组指针
数组指针:一个指针,而指针的指向是一个数组!
常用形式:类型 (*变量)[长度]
int (*p2)[10];
/*
由于()的优先级高,所以p2表示是一个指针
指针指向的地址长度为int[10]的大小
即:p2为一个指向int[10]数组的指针
*/
有时候我们也把数组指针成为“行指针”,遇到多维数组的时候经常使用。
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p = (int(*)[4])a;
for(int i=0;i<3;i ) {for(int j=0;j<4;j ) {printf("%d\n", *(*(p i) j)); }
}
指针函数
指针函数:一个函数,函数的返回值是一个指针!
常用形式:返回类型 * 函数名(形参类型 形参名)
int * max(int *a,int *b) {return (*a > *b) ? a : b;
}
指针函数也比较容易理解,就是返回的是一个指针的函数。
函数指针
函数指针:一个指针,指针指向的是一个函数!
常用形式:返回类型 (*变量)(形参类型)
int (*func) (float, float);
/*
(*func)表明func是一个指针,指向一个函数
前面int,表示该返回值
后面的两个float表明该函数的两个形参类型
*/
举个例子:
int sum(int a, int b) { return a b;}
int main() { //声明同时初始化函数指针 int (*ptr)(int, int) = sum; //使用*ptr即可替代sum函数 printf("%d\n", (*ptr)(10, 20)); return 0;}
到这里是不是觉得这一切so easy?那么难度开始提升~
const char *(*f_ptr[10])(int a[], double * b)
请问 f_ptr 是啥?别慌,看上去这行代码很长,但是我们一起来分析一下:
f_ptr 后面跟着 [10] ,由于 [] 的优先级更高,所以 f_ptr 是一个长度为10的数组!我们把 f_ptr[10] 看作为 X ,那么数组里面装的啥呢?
const char *(*X)(int a[], double * b)
观察 X 之前的 * ,所以数组里装的是指针!我们把 (*X) 看作为 Y ,那么这个指针指向的又是什么呢?
const char * Y(int a[], double * b)
仔细观察 Y 前后,就可以发现这是一个函数指针,指针指向的函数返回一个 const char * 的指针,而函数的形参 (int [], double *) 。
综上, f_ptr 是一个长度为10的数组,数组元素为返回 const char * ,参数 (int [], double *) 的函数指针。
声明:
本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。