C语言指针(进阶)

#include<stdio.h>

/**
 * 指针数组与数组指针
 * @return
 */

int main(){

    /**
     * 指针数组
     */

    //指针数组,本质上是一个数组,不过这个数组是用于存放指针的数组
    int a,b,c;
    int * arr[3] = {&a,&b,&c};  //本质上还是数组,只不过存的都是地址

    //因为数组中全都是指针,比如我们现在想要访问数组中第一个指针指向的地址
    *arr[0] = 100;  //[]运算符的优先级更高,所以这里先通过[0]取出地址,然后再使用*将值赋值到对应的地址上
    printf("%d\n",a);

    //当然,我们也可以用二级指针变量来得到指针数组的首元素地址
    int* p[3];   //因为数组内全是指针
    int** pp = p;  //所以可以直接使用指向指针的指针来指向数组中的第一个指针元素

    printf("——————————————————————————————————————————————————————————————————————————————\n");

    /**
     * 数组指针
     */

    //数组指针,本质上是一个指针,不过它是一个指向数组的指针(注意,它的目标是整个数组,和我们之前认识的指针不同,之前认识的指针是指向某种类型变量的指针)
    //int* p;  指向int类型的指针
    //int (*p)[3];  //注意这里需要将*p括起来,因为[]优先级更高
    //注意它的目标是整个数组,而不是普通的指针那样指向的是数组的首个元素

    int brr[3] = {111, 222, 333};
    int (*q)[3] = &brr;  //直接对整个数组再取一次地址(因为数组指针代表的是整个数组的地址,虽然和普通指针都是指向首元素地址,但是意义不同)

    printf("%d, %d, %d\n", *(*q+0), *(*q+1), *(*q+2));   //要获取数组中的每个元素,稍微有点麻烦

    /**
     *  q代表整个数组的地址
     *  *p表示所指向数组中首元素的地址
     *  *p+i表示所指向数组中第`i`个(0开始)元素的地址(实际上这里的*p就是指向首元素的指针)
     *  *(*p + i)就是取对应地址上的值了
     */
    printf("%p\n",q);
    printf("%p\n",*q);


}

#include<stdio.h>

/**
 * 指针函数与函数指针
 * @return
 */

//函数可以返回一个指针类型的结果,这种函数称为指针函数
int* test(int* a){  //函数的返回值类型是int* 指针类型的
    return a;
}

//函数指针
int sum(int a,int b){  //这个函数实现了a + b
    return a+b;
}

//有了函数指针,我们就可以编写函数回调了(所谓回调就让别人去调用我们提供的函数,而不是我们主动来调别人的函数),
//比如现在我们定义了一个函数,不过这个函数需要参数通过一个处理的逻辑才能正常运行
int sum2(int (*p)(int, int), int a, int b){  //将函数指针作为参数传入
    //函数回调
    return p(a, b);    //就像你进了公司然后花钱请别人帮你写代码,工资咱们五五开,属于是直接让别人帮你实现
}

int main(){

    //指针函数
    int a = 100;
    int* p = test(&a);  //使用int* 指针类型去接受返回值
    printf("%p\n",p);
    printf("%d\n",*test(&a));

    //函数指针
    int (*q)(int,int) = sum;
    printf("%p\n",q);  //这样我们就拿到了函数的地址

    //接下来,通过函数指针调用函数
    int result1 = (*q)(1,2);//就像我们正常使用函数那样,(*p)表示这个函数,后面依然是在小括号里面填上实参
    int result2 = q(1, 2);  //当然也可以直接写函数指针变量名称,效果一样
    printf("%d = %d", result1,result2);

    int (*t)(int, int) = sum;  //拿到实现那个函数的地址
    printf("%d", sum2(t, 10, 20));


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值