c语言指针指向指,C语言:指向指针的指针

本文介绍了在C语言中遇到的需要使用指针的指针来传递静态结构体的场景。通过一个实例展示了如何在无法修改接口的情况下,利用指针的指针来获取并修改静态结构体的值。分析了代码中的取址运算符、类型转换及指针的层次,解释了为什么不能直接传入指针以及函数参数传递的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是第一次遇到需要使用指针的指针的情况,可能是代码敲得少了吧,于是记录下来

实际的需求是A文件需要用到的B文件中一个静态结构体,而接口已被写好,不能更改了,类似下列代码

B文件,定义了一个结构体temp,接口函数为read

typedef struct{

int data;

}temp_s;

static temp_s temp={1};

void read(void *p)

{

}

文件A需要使用read函数得到temp的指针

int main()

{

temp_s *p;

//将temp的指针赋值给p

printf("data = %d\n",p->data);

}

以上是实际中遇到的问题,解答方式如下,下列代码可以直接gcc编译运行

#include

#include

#include

typedef struct{

int data;

}temp_s;

static temp_s temp={20};

void read(void *p)

{

*((uint64_t*)p)=(uint64_t)&temp;

}

int main()

{

temp_s* b;

read(&b);

printf("data:%d\n",b->data);

return 0;

}

然后简单分析一下这个代码,首先从函数调用处开始。

read(&b);

&是取址符号,b是一个指向temp结构体的指针,那么&b实际表示的就是b这个指针的地址,也等效与一个指向指针的指针,因为通过它我们能够找到指针p。

这里简单说一下指针,首先指针是需要分配内存的,根据是多少位MCU来定,例如32位单片机则指针大小就是32位,他本身有个内存地址,同时改地址里面又保存了这个指针的指向对象的地址。

接下来是read里面的处理

*((uint64_t*)p)=(uint64_t)&temp;

((uint64_t)p)表示先将p转化为一个64位指针,因为参数是void,不转化的话是不知道该指针指向了个啥的,然后取*,实际上就是根据这个指针找到所指的对象,由上文可知传入的是一个指向指针的指针,那个他所指的对象就是个指针,也就是b。(uint64_t)&temp;就很好理解,得到temp的指针。我这里在PC上编译所以使用的是64。

我们是不能只接将b传入到read中的,如下

read(b);

总所周知函数参数实际上是传入参数的赋值版本,对其修改是不能修改原值的,其实该问题等效于我想修改变量A,那么在传入参数的时候需要取址&A,这里是想修改指针,也就同理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值