数组指针、指针数组、函数指针和指针函数

首先要了解一个优先级问题

[ ] 和()具有相同的优先级 都比 *(解引用运算符)的优先级要高

数组指针 :变量名先与[ ] 结合 变成一个数组 然后 在与 * 结合成为一个指针 

如下所示

int *p[3];

定义的是一个含有三个指针元素的数组 且 指针指向的都是整型(int)

如下我们定义a,b,c三个变量 且使用 p 数组中的指针指向他们

    int *p[3];
    int a = 1,b = 2,c = 3;
    p[0] = &a; p[1] = &b; p[2] = &c;
    printf("*p[0] = %d \n",*p[0]);
    printf("*p[1] = %d \n",*p[1]);
    printf("*p[2] = %d \n",*p[2]);

然后我们打印结果

由此可以看出 p数组中的确包涵着三个指针

 指针数组 :顾名思义,一个指针指向类型的是一个数组

同样的我们定义一个指针数组

int (*p)[3];

上面的定义表明 p指针指向的是一个含有三个整型元素的数组

现在给其中的元素进行赋值

    int (*p)[3];
    p = (int *)malloc(3 * sizeof(int));
    *(*p + 0) = 1;
    *(*p + 1) = 2;
    *(*p + 2) = 3;

初始化的指针 是需要申请内存才能进行操作,所以我首先申请了 3个int大小的内存

这里解释一下为什么要使用两个*(解引用符)进行赋值

第一次解引用 *p表示的是 含有三个整型数组的内存 此时还不是里面的数据

然后再一次解引才是里面的数据

打印看一下

可以看出打印出来的和我们预想的是一样的 

OK 通过上面的讲解 我们可以更好地理解下面的内容---函数指针和指针函数

函数指针:顾名思义 首先这是一个函数 它返回的是一个指针类型的数据

先定义一个函数指针

int *getmax(int *a,int *b){
    return  *a > *b?a:b;  
}

这个函数的功能是返回值较大的那个函数的地址

    int *p,*num1 = 7,*num2 = 2;
    p = getmax(&num1,&num2);
    printf("*p = %d\n",*p);

运行如上代码 打印结果

 发现他确实如我们预期的那样打印出了正确的结果

指针函数:一个指针它指向的内容是一个函数

老规矩定义一个函数

这里我们依旧拿比大小的函数来举例

int getmax(int a,int b){
    return  a> b?a:b;  
}

只不过我们将返回值和传入值都变成了普通的整型

来分析一下上面的函数 返回值的类型是 int 传入的形参也是两个int型的

所以我很可以这样定义指针函数

int (*p)(int,int);

第一个值表示返回类型 第二个是指针名 第三个是传入类型

执行如下代码

    int (*p)(int,int);
    p = getmax;
    printf("max is %d\n",(*p)(5,2));

 发现我们想要的结果被正确地执行了出来

如果觉得讲得好的 来个小小地赞吧ヾ(◍°∇°◍)ノ゙

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值