「C语言」指针数组 数组指针 指针函数 函数指针

相信很多人和我一样,有着这样的恐惧,那就是这四个玩意怎么也分不清,这都是啥啥啥啥呢?今天我们来具体分析一下。其实要具体了解这四个概念,只需要了解符号优先级,并关注最后两字,你就成功了一半。

符号优先级

在一个表达式中可能包含多个不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现运算错误。所以表达式必须按一定的顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。所以请牢牢记住下面三个符号的优先级判断,这对今天理解这四个概念,十分重要!

(内) [ ] >  *

 指针数组

指针数组:一个数组,数组的元素是一个指针!

常用形式:类型 *变量[长度]

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 *) 的函数指针。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值