指针的指针作为函数形参时的两种操作方法

注:
1、以下测试在xp sp3 32位系统,Codeblocks 17.12(GCC编译器)上进行,其他平台未测试
2、本文只是我个人的理解,不一定完全正确
3、版权所有,转载请注明作者和出处

一、修改指针的指针指向的地址中存放的值【修改二级指针指向一级指针指向的值】

1、方式一:函数形参采用指针的指针(二级指针)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

uint8_t Hello[2]={100,200};
uint8_t *pHello=&Hello[0];
void pp_test(uint8_t **ppdata)
{
    **ppdata=1;
    *(*ppdata+1)=2;
}

int main()
{
    printf("%d\n",Hello[0]);
    printf("%d\n",Hello[1]);
    pp_test(&pHello);
    printf("%d\n",Hello[0]);
    printf("%d\n",Hello[1]);
    return 0;
}

2、方式二:函数形参采用三级指针

#include <stdlib.h>
#include <stdint.h>

uint8_t Hello[2]={100,200};
uint8_t *pHello=&Hello[0];
void pp_test(uint8_t ***ppdata)
{
    *(**ppdata+0)=1;
    *(**ppdata+1)=2;
}

int main()
{
    uint8_t **pp=&pHello;

    printf("%d\n",Hello[0]);
    printf("%d\n",Hello[1]);
    pp_test(&pp);
    printf("%d\n",Hello[0]);
    printf("%d\n",Hello[1]);
    return 0;
}

 

二、修改指针的指针中存放的地址【修改二级指针中存放的值(一级指针的地址)】

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
const uint8_t teststring[35]={"12345567890"};
const uint8_t *pteststring=&teststring[0];
const uint8_t Firmware_Time[35]={"Build time:"__DATE__" - "__TIME__""};
const uint8_t *pFirmware_Time=&Firmware_Time[0];
void pp_test(const uint8_t **ppdata)
{
    *ppdata=&pFirmware_Time;//把指针的地址放入二级指针的值中
}
int main()
{
    const uint8_t **pp=&pteststring;

    printf("二级指针修改前指向的内容pp=%s\n",*pp);
    pp_test(&pp);
    printf("二级指针修改后指向的内容pp=%s\n",*pp);

    return 0;
}

如果对pp_test函数中,为什么使用的是*p?而不是**p呢,如果是 **p的话,结果就是“一”中的效果,无法得到我们想要的结果:要修改二级指针中存放的内容,所以这里就用*p了,如果还是不理解的话,可以参考下面的例子:地址传入后,要修改地址里面的内容,当然要用*p啦,即*+地址=xx就可以修改地址中的内容了。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main()
{
    int a=100;
    int addr=&a;

    printf("%d\n",a);
    printf("%d\n",&a);
    printf("%d\n",addr);

    //*((int *)2293576)=12345;          //把a的地址2293576强制转换为地址,对这个地址赋值,即间接的修改了a的值
    printf("%d\n",(*(int *)addr)=12345);//把a的地址2293576强制转换为地址,对这个地址赋值,即间接的修改了a的值
    printf("%d\n",a);

    return 0;
}

上面通过函数调用把某个指针的值传到了调用者的二级指针中,这样操作这个二级指针的效果就和操作一级指针一样,这么做的原因就是减小模块间的耦合,保护私有成员,用途大大的有啊。

 

2020-03-11@北京 晴,天气转暖了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值