注:
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@北京 晴,天气转暖了