Подтвердить что ты не робот

Передача указателем

Я запутался между этими двумя функциями:

void Swap_byPointer1(int *x, int *y){
    int *temp=new int;
    temp=x;
    x=y;
    y=temp;
}

void Swap_byPointer2(int *x, int *y){
    int *temp=new int;
    *temp=*x;
    *x=*y;
    *y=*temp;
}

Почему Swap_byPointer2 удается выполнить обмен между x и y, а Swap_byPointer1 - нет?

4b9b3361

Ответ 1

Первый фрагмент заменяет адреса памяти, которые являются значениями указателей. Поскольку указатели являются локальными копиями, это не влияет на вызывающего.

Переписано без утечки памяти:

void Swap_byPointer1(int *x, int *y){
    //e.g x = 0xDEADBEEF and y = 0xCAFEBABE;
    int *temp=x;
    x=y;
    y=temp;
    //now x = 0xCAFEBABE and y = 0xDEADBEEF
}

Вторая свопит точки (объекты, на которые указывают указатели).

Переписано без утечки памяти:

void Swap_byPointer2(int *x, int *y){
    //e.g *x = 100 and *y = 200
    int temp =*x;
    *x=*y;
    *y=temp;
    //now *x = 200 and *y = 100
    //there are now different values at the original memory locations
}

(Указатели могут указывать на динамически выделенные объекты, но не обязательно. Использование указателя не означает, что должно быть новое -распределение. Указатели могут указывать на объекты с автоматическим временем жизни как а.)

Ответ 2

В вашей первой функции вы меняете сами указатели, а во втором вы меняете значения, на которые указывают указатели, т.е. указатели разыменовываются.

Если вы хотите изменить указатель на указатель, вы должны передать указатель на указатель (т.е. int**x) и изменить второй указатель.

Таким образом

void Swap_byPointer1(int **x, int **y){
    int *temp;
    temp=*x;
    *x=*y;
    *y=*temp;
}

Ответ 3

Первоначальная настройка функций (общая для обоих) (макетные значения)

(Предположение: значения, записанные вне полей, являются адресом.)

enter image description here

Функция swap_byPointer1,

enter image description here

Функция swapby_Pointer2,

enter image description here

Надеюсь, это помогло получить картину того, что происходит, Cheers!

Ответ 4

Потому что параметры передаются по значению. В первом примере кода все, что вы делаете, это замена локальных копий указателей. Второй пример на самом деле пишет адресату.

Лучше всего было бы использовать проход по ссылке и избежать выделения кучи, используя выделенную стек temp int.

void SwapByRef(int &x, int &y)
{
    int temp=x;     
    x=y;     
    y=temp;
}
....
int x=1;
int y=2;
SwapByRef(x, y);

Как указывали другие, обе ваши образцы кода проверяют утечку, потому что temp никогда не удаляется. Для простого int, как это, просто используйте стек, назначенный локальной переменной int для вашего темпа.

Ответ 5

Первая функция - это просто переназначение локальной копии указателей, а не изменение базовых значений. Когда он вернется, он не будет иметь никакого эффекта (кроме выделения нового int)