void s(int* a, int* b) {
a=b;
}
int main(int argc, char* argv[]) {
int* a = malloc(sizeof(int));
int* b = malloc(sizeof(int));
int c = 10;
int d = 5
a = &c;
b = &d;
printf("%d %d\n",*a,*b);
s(a,b);
printf("%d %d\n",*a,*b);
}
我很困惑。这是非常简单的代码。我认为这将导致a和b指向相同的值。当我在主要功能内执行a = b时,一切都会按预期进行。当我使用gdb时,它甚至表明它们指向内存中的相同位置,并且该功能并未得到优化!!!那到底是怎么回事? 函数是否正在创建自己的本地副本?这些为什么不指向同一变量,请帮忙。
答案 0 :(得分:2)
您要更改指针值。指针是按值传递的,因此您需要一个指向该指针的指针来更改其值:
#include <stdio.h>
void s(int** foo, int** bar)
{
*foo = *bar;
}
int main(void)
{
int c = 10;
int d = 5;
int *a = &c;
int *b = &d;
printf("%d %d\n", *a, *b); // 10 5
s(&a, &b);
printf("%d %d\n", *a, *b); // 5 5 a points at d as well
}
在您的版本中,您仅更改了参数,这些参数是传递给函数的值的副本。
为帮助您更好地理解,请考虑以下问题:
#include <stdio.h>
void value(int foo, int bar)
{
foo = bar; // changing local copies
}
void pointer(int *foo, int *bar)
{
*foo = *bar; // changing the value foo points to to the value bar points to
}
int main(void)
{
int a = 5;
int b = 7;
value(a, b);
printf("%d, %d\n", a, b); // 5, 7
pointer(&a, &b);
printf("%d, %d\n", a, b); // 7, 7
}
我们使用int
类型进行了此操作。现在,只需将int
替换为int*
:
#include <stdio.h>
void value(int *foo, int *bar)
{
foo = bar; // changing local copies
}
void pointer(int **foo, int **bar)
{
*foo = *bar; // changing the value foo points to to the value bar points to
}
int main(void)
{
int x = 5;
int y = 7;
int *a = &x;
int *b = &y;
value(a, b);
printf("%d, %d\n", *a, *b); // 5, 7
pointer(&a, &b);
printf("%d, %d\n", *a, *b); // 7, 7 now both point at y
}
所以您看到,两次都是相同的概念。在第一个示例中,指向的值是int
,而它们的值是数字,在第二个示例中,指向的值是int*
,而它们的值是指针值( <〜标准术语,“地址”)。但是机制是一样的
答案 1 :(得分:-2)
您的程序几乎是正确的,但是您需要在通过引用调用时在函数中传递变量的地址,并在函数中使用指向指针的指针。