Передача и присвоение нового значения указателю 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;
}