在函数中将指针赋值到不同的地址

Assigning pointer to a different address in function

本文关键字:地址 赋值 函数 指针      更新时间:2023-10-16

只是好奇这是怎么解释的?

void f(int * x);
int test = 100;

int main()
{
 int z = 35;
 int * a = &z;
 f(a);
 cout<<*a;
..
}

void f(int *x)
{
    x = &test;
}

我们被告知,如果我们想修改"外部"对象(如本例中的a),可以在函数实参内部使用指针。但x = &test没有做太多,cout仍然打印35。我知道*x =someVal会工作,虽然在f()。

在C语言中,指针是按值传递的,就像整型、浮点数等一样。如果你想修改它并让修改在函数调用之外可见,你需要传递一个指针指向你想要修改的东西,在这个例子中是一个指向int型指针的指针:

void f(int **x) {
    *x = &test;
}

然而,在c++中传递引用是一种更好的方法:

void f(int*& x) {
    x = &test;
}

如果你把问题标为C,你教的内容是可以接受的。对于c++来说,这在技术上是正确的,但在道德上是错误的,你应该通过引用传递来修改对象,而不是摆弄指针和地址。

在你的代码中,你得到了你编码的目的:传递一个指针,然后重新分配指针的值。这在函数外是不可见的。你要做的是

void f(int *x)
{
    *x = 42;
}

和c++版本是:

void f(int &x)
{
  x = 42;
}
int main()
{
  int z = 35;
  f(z);
  cout << z;
}

由于其中一个成员的推荐,我添加了我自己的答案,这是我从其他人的回答中得出的。所以感谢他们。基本上,我的代码中的问题是我正在更改指针的副本。

函数f中的x和传递给f的值a唯一的共同点是它们指向的地址