我试图更深入地理解C函数中的指针参数。我已经编写了一个测试程序,试图看到将单个指针传递给一个函数的双指针然后修改它之间的区别。
我有一个有两个function的程序。 第一个函数modifyMe1
将单个指针作为参数,并将a属性更改为7.第二个函数modifyMe2
将双指针作为参数,并将a属性更改为7。
我预计第一个函数modifyMe1
将是“按值传递”,即如果我传入了我的结构指针,C将创建它指向的数据的副本。 对于后者,我正在做一个“传递参考”,它应该修改到位的结构。
但是,当我测试这个程序时,两个函数似乎都修改了结构。 我知道对于指针的性质我有一个误解是肯定的。 有人可以帮我解决这个问题吗?
谢谢!
这是我有的:
#include #include struct myStructure { int a; int b; }; void modifyMe1(struct myStructure *param1) { param1->a = 7; } void modifyMe2(struct myStructure **param1) { (*param1)->a = 7; } int main(int argc, char *argv[]) { struct myStructure *test1; test1 = malloc(sizeof(test1)); test1->a = 5; test1->b = 6; modifyMe1(test1); printf("a: %d, b: %dn", test1->a, test1->b); // set it back to 5 test1->a = 5; printf("reset. a: %d, b: %dn", test1->a, test1->b); modifyMe2(&test1); printf("a: %d, b: %dn", test1->a, test1->b); free(test1); return 0; }
我的输出是:
$ ./a a: 7, b: 6 reset. a: 5, b: 6 a: 7, b: 6
您可以在C中以不同的方式传递参数(Captain Obvious,yes)。
使用常规参数,例如int
您将获得本地副本
使用指针参数,比如说int*
你可以修改它指向的内容
使用双指针参数,比如说int**
你可以修改指针本身,即“重新指定”它。
添加另一个function:
void modifyMe0(struct myStructure param1) { param1.a = 7; }
这会按值传递结构。 函数中的修改不会反映在传递给modifyMe0()
的参数中。
像这样添加调用代码:
printf("Before 0: a = %d, b = %dn", test1->a, test1->b); modifyMe0(*test1); printf("After 0: a = %d, b = %dn", test1->a, test1->b);
请注意,调用代码中的before和after值是相同的。 您还可以向modifyMeN()
函数添加打印,以certificate其中的值已被修改。
将指向结构的指针传递给被调用函数时,可以修改调用函数中结构的值。 当您通过值将结构传递给被调用的函数时,不会修改调用函数中的结构的值。
你可以创建另一个函数:
void modifyMe3(struct myStructure **p1) { free(*p1); *p1 = malloc(sizeof(*p1)); (*p1)->a = -3; (*p1)->b = -6; }
像这样添加调用代码:
printf("Before 3: address = %p, a = %d, b = %dn", (void *)test1, test1->a, test1->b); modifyMe0(*test1); printf("After 3: address = %p, a = %d, b = %dn", (void *)test1, test1->a, test1->b);
请注意,在调用modifyMe3()
之后,结构的地址已更改。
需要了解更多c/c++开发分享在函数调用中被单指针和双指针参数混淆,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享在函数调用中被单指针和双指针参数混淆相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980429.html