【发布时间】:2014-09-26 05:45:07
【问题描述】:
我试图更深入地了解 C 函数中的指针参数。我编写了一个测试程序来尝试查看将单指针与双指针传递给函数然后对其进行修改之间的区别。
我有一个有两个功能的程序。第一个函数modifyMe1 将单个指针作为参数并将a 属性更改为7。第二个函数modifyMe2 将双指针作为参数并将a 属性更改为7。
我预计第一个函数modifyMe1 将是“按值传递”,也就是说,如果我传入我的结构指针,C 将创建它指向的数据的副本。而对于后者,我正在做一个“按引用传递”,它应该修改适当的结构。
但是,当我测试这个程序时,这两个函数似乎都修改了适当的结构。我知道我对指针的性质存在误解,这肯定是论据。有人可以帮我解决这个问题吗?
谢谢!
这是我所拥有的:
#include <stdio.h>
#include <stdlib.h>
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: %d\n", test1->a, test1->b);
// set it back to 5
test1->a = 5;
printf("reset. a: %d, b: %d\n", test1->a, test1->b);
modifyMe2(&test1);
printf("a: %d, b: %d\n", test1->a, test1->b);
free(test1);
return 0;
}
我的输出是:
$ ./a
a: 7, b: 6
reset. a: 5, b: 6
a: 7, b: 6
【问题讨论】:
-
您可以随时修改指针所指的内容。但是,由于 C 中的所有内容都是按值(副本)传递的,因此您无法更改函数参数,以便调用者可以看到更改,除非您添加间接级别。即,此代码仅修改本地副本;
void foo(int *p) { p = malloc(size); }. -
如果使用指针,则按指针传递,而不是按值传递。如果使用双指针,则传递指针的地址。如果要传递值,则不带任何指针传递。
-
@IvanIvanov:我并不是要学究气,但由于这是一个似乎让所有初学者感到困惑的问题,C 中的 everything 都是按值传递的。这也包括指针。
-
是的,这很令人困惑,因为当你传递不是指针的值时,它被称为传递值,而当你传递指针的值时,这被称为传递——指针。
-
@IvanIvanov:我从来没有使用过“pass-by-pointer”这个词。我认为更简单的理解是,在 C 中,一切都是按值传递的。指针在任何方面都不是特殊的。
标签: c pointers pass-by-value pass-by-pointer