Передача и присвоение нового значения указателю C++

Я передаю указатель на функцию. Я хотел бы назначить новый адрес передаваемому указателю внутри функции, и я хотел бы, чтобы этот адрес использовался после возврата из функции. Я не уверен, если это возможно, но я хотел бы сделать:

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? Может ли это работать (если это не так: почему)?

3 ответа

Решение

Передайте ссылку на указатель:

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 в рамках функции. Тем не менее, вы увидите, что a в main не изменяется на 10 после возврата функции.

Изменить aнужно пройти int по ссылке:

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

int main()
{
   int a = 0;
   foo( a );
   // a is now 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;
}

Если вы программируете на чистом 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; 
}
Другие вопросы по тегам