指针传递至函数后地址变化问题:如何保持指针地址不变?
指针传递时保持变量地址一致的解决方案
为啥原代码里指针地址不一样?
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
相关产品推荐
相关产品推荐

