在功能中为指向不同地址的指针

时间:2013-06-11 20:39:49

标签: c++

只是好奇这是什么解释?

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()中使用。

3 个答案:

答案 0 :(得分:2)

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

在你的代码中,你得到你编码的内容:传递一个指针然后重新分配那个poitner的值。这在功能之外是不可见的。你打算做的是

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

和C ++版本就像:

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

int main()
{
  int z = 35;
  f(z);
  cout << z;
}

答案 1 :(得分:2)

在C指针中,值就像整数,浮点数等一样传递。因此,如果你想修改它并在函数调用之外看到那个修改,你需要传递一个指向要修改的东西的指针,在这种情况下,这是一个指向int指针的指针:

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

但是,在C ++中传递引用是一种更好的方法:

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

答案 2 :(得分:1)

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

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