2016-07-25 2 views
-2

Предположим, что у меня есть следующий код:Попутный указатели как ссылки

swap (int&x, int&y) 
{ 
    int temp = x; 
    x = y; 
    y = temp; 
} 
int main() 
{ 
    int* x; 
    int* y; 

    *x = 5; 
    *y = 6; 

    swap(*x, *y); 

    cout<< *x << *y; 

} 

Выход: 65

Так своп является успешным. Указатель х теперь указывает на 6, и у точек на 5.

Теперь, если я изменю своп вызов к этому:

swap(x, y); 

Выход по-прежнему: 65

Что я не понимаю , Когда я это сделаю:

swap(*x, *y); 

I указатели смежности x и y, а затем передают значения x и y в функцию в качестве ссылок. Но когда я делаю:

swap(x, y); 

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

Поскольку в первом случае я передавал значения, но во втором случае я передавал в адрес памяти, почему они возвращают те же значения и имеют одинаковое поведение?

Благодаря

+0

'int * x;' Это определяет * неинициализированный * указатель на int. '* x = 5;' Это вызывает UB (неопределенное поведение), так как программа записывает на некоторый случайный адрес памяти, который он не имеет. – dxiv

+0

При публикации кода, пожалуйста, разместите всю свою программу –

ответ

0

(Не обращая внимания на тот факт, что вы никогда не выделять память для x и y, что неопределенное поведение. При этом предполагается, что вы инициализировать их должным образом)

x указывает на ячейку памяти (давайте скажем), 13, который имеет значение 5.

y указывает на ячейку памяти 14, которая имеет значение 6.

Когда вы swap их (обратите внимание, что вы используете std::swap, а не ваш swap функцию), x будет указывать на ячейку памяти 14 и y будет указывать на ячейку памяти 13. Таким образом, значения не изменились вообще, только указатели, которые указывают на них.

Похоже, что они переключили их значения, но они этого не сделали, они просто указали куда-то еще.

Смежные вопросы