You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针传递至函数后地址变化问题:如何保持指针地址不变?

指针传递时保持变量地址一致的解决方案

为啥原代码里指针地址不一样?

C语言中函数参数默认是值传递——哪怕传递的是指针,本质也是把原指针变量里存储的地址值复制一份给函数的形参。说白了就是test函数里的p是main里p的“独立副本”,两个变量在栈上各占不同的存储空间,地址自然不一样,这跟inline关键字没有任何关系。

用inline能达成目标吗?

不能。inline只是向编译器建议将函数代码直接嵌入调用位置(减少函数调用的跳转开销),但它并没有改变参数传递的规则。就算函数被inline展开,只要还是按值传递指针,编译器依然可能为形参分配独立的栈空间(偶尔会有优化复用的情况,但这完全依赖编译器实现,C标准不做强制保证),无法确保两个p的地址一定一致。

正确的实现方式

要让函数中操作的指针变量和main里的是同一个,需要传递指针的指针(即指向指针的指针)。这样函数通过这个二级指针,就能直接访问原指针变量的存储地址。

修改后的代码示例

#include <stdio.h>

void test(int **pp) {
    // 此处打印的就是main函数里p的地址
    printf("%p\n", (void*)pp);
    // 若要操作原指针指向的内容,使用*pp即可
    printf("原指针指向的值:%d\n", **pp);
}

int main(void) {
    int a = 10;
    int *p = &a;
    printf("%p\n", (void*)&p);
    // 传递指针p自身的地址
    test(&p);
    return 0;
}

输出示例

0x7ffe53b10938
0x7ffe53b10938
原指针指向的值:10

此时main里&p的地址和test里pp的地址完全一致,因为pp就是原指针变量p的地址,直接指向它的存储位置。

内容的提问来源于stack exchange,提问作者hddmss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:10:38