****** /---\
* 20 * ----> | 2 |
****** \---/
i 20-24
Здесь i
представляет собой указатель, указывающий на местоположение 20
памяти, которая имеет значение 2
т.е. когда двоичные данные в 20 + sizeof(int) - 1
интерпретируется как десятичное число. Теперь, когда вы проходите i
к advance
, который имеет аргумент ptr
, что на самом деле происходит,
****** /---\ ******
* 20 * ----> | 2 | <---- * 20 *
****** \---/ ******
i 20-24 ptr
ptr = i;
т.е. значение i
устанавливается на значение ptr
, которые действительно обращается здесь, так как i
и ptr
являются указателями.
При увеличивает ptr
это будет просто сделать точку указателя на другой адрес и ничего не изменилось по отношению к i
поскольку ptr
является копией, а не сам i
. Однако, если вы измените значение на ptr
с помощью оператора *
, то есть *ptr = 10
; то значение 2
будет изменено на 10
, таким образом, изменив также *i
, что также укажет на 20. Снова обратите внимание, что адрес или значение i
нетронуто, только то место, где оно указывает на изменение. Если бы было 10 указателей, указывающих на адрес 20
, даже тогда ни один из них не будет изменен, но все их значение, указывающее на значение, изменится.
Java имеет только пройти по значению также (http://stackoverflow.com/questions/40480/is-java-pass-by-reference), так что на самом деле C просто как Java в этом отношении –
Да, вы правы, это был другой язык. Python или какой-то менее строгий язык. Спасибо, что вспомнил об этом :). – Binarian
Вероятно, это Java. Классы в Java являются ссылочными типами. Это означает, что переменные относятся к экземплярам, то есть они просто указывают на экземпляр. И оператор '.' включает в себя неявное разыменование указателя. В отличие от C. Это вопрос, о котором вы говорите, я думаю. Поскольку Java не имеет пропущенных значений, на самом деле невозможно написать функцию свопинга в Java! –