【问题标题】:Passing and Assigning New Value to Pointer C++向指针 C++ 传递和分配新值
【发布时间】:2015-02-13 22:51:10
【问题描述】:

我正在传递一个指向函数的指针。我想为函数内部传递的指针分配一个新地址,并且我希望在函数返回后使用该地址。我不确定这是否可能,但我想这样做:

int main()
{
    int i = 100, j = 200;
    int * intPtr = &i;
    foo(intPtr, j);
    //  I want intPtr to point to j, which contains 200 after returning from foo.
}

void foo( int * fooPtr, int & newInt )
{
    int * newIntPtr = &newInt;
    fooPtr = newIntPtr;
}

这可能吗,或者intPtr 从foo 返回后不会维持新的分配?这能行吗(如果不行:为什么)?

【问题讨论】:

标签: c++ pointers reference function-calls


【解决方案1】:

传递对指针的引用:

void foo( int *& fooPtr, int & newInt )

你的方法不起作用的原因是你传递了指针按值。按值传递会在函数中创建一个临时对象,因此一旦函数返回,对临时对象所做的任何更改都会消失。

和这个没有什么不同:

void foo(int x)
{
   x = 10;
}

int main()
{
   int a = 0;
   foo( a );
   // a is still 0, not 10
}

a是按值传递的,所以foo()函数在函数内将参数改为10。但是,您会看到main 中的a 在函数返回后不会变为10。

要更改a,您需要通过引用传递int:

void foo(int& x)
{
   x = 10;
}

int main()
{
   int a = 0;
   foo( a );
   // a is now 10
}

【讨论】:

  • 谢谢!这正是我需要知道的。
【解决方案2】:

传递一个指针的指针并赋值给它

int main()
{
    int i = 100, j = 200;
    int * intPtr = &i;
    foo( &intPtr, j );
    //  I want intPtr to point to j, which contains 200 after returning from foo.
}

void foo( int ** fooPtr, int & newInt )
{
    int * newIntPtr = newInt;
    *fooPtr = newIntPtr;
}

【讨论】:

  • int * newIntPtr = newInt; 的类型不兼容
  • 您好像有错字:int * newIntPtr = &newInt;
【解决方案3】:

如果你用纯 C 编程,你可以这样做

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void foo(int **, int *);


 int main()
{
  int i = 100, j = 200;
  int * intPtr = &i;
  int  *intPtr2=&j;
  foo( &intPtr, intPtr2 );
  //  I want intPtr to point to j, which contains 200 after returning   from foo.
  printf("%d",*intPtr);
}
 void foo( int ** fooPtr, int * newInt )
{
  int * newIntPtr = newInt;

  *fooPtr = newIntPtr; 
}

【讨论】:

  • 我认为这会将值 200 分配给 intPtr 指向的地址,但 intPtr 不会指向 j。我需要 intPtr 指向的地址来改变 main.
  • 我编辑了代码,现在你可以改变这个指针指向j。我使用指针指向指针,并在main中发送指针的地址。以上是完全相同的答案,所以我希望这会有所帮助。是的,你是对的。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2016-12-28
  • 2013-04-03
  • 2010-12-22
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多