Название явное. Какая принципиальная или фундаментальная разница между этими методами при определении функций или методов?
Важно: несмотря на то, что этот вопрос очень похож на этот на stackoverflow , он не предназначен для перевода какого-либо из их ответов.
Когда это по значению , информация о переменной сохраняется в другом адресе памяти при получении в функции, поэтому, если значение этой переменной изменяется, это не влияет на исходную переменную, оно изменяется только в контексте функции .
Когда это по ссылке , переменная, полученная в качестве параметра в функции, указывает точно на тот же адрес памяти, что и исходная переменная, поэтому, если ее значение изменяется внутри функции, исходная переменная также изменяется.
Как показано на этой гифке.
Суть отличия соответствует свободе (или ограничению), существующей на параметр функции или метода.
Передача по значению относится к передаче копии значения параметра из клиентской функции/метода. Будучи копией, внесенные непосредственно в функцию/метод изменения значения параметра не будут отражены в конце выполнения функции/метода.
Передача по ссылке означает передачу того же значения параметра из клиентской функции/метода. Будучи одним и тем же значением, изменения, сделанные непосредственно в функции/методе в значении параметра , будут отражены в конце выполнения функции/метода.
Чтобы привести пример этого, представьте себе физический документ, который вы держите в руках. Вы передаете этот документ по значению, когда впервые делаете копию документа и передаете ее коллеге. Если партнер случайно запачкает этот документ, ваш оригинальный документ не пострадает, так как партнер работал над копией. С другой стороны, передача документа по ссылке означает, что вы отдаете исходный документ своему коллеге, и если он его сожжет, создаст новый с совершенно другим содержанием и вернет вам, то теперь то, что он вам дал, будет документ и оригинал документа были утеряны :(.
С технической точки зрения вы можете увидеть этот пример на C:
Результат печати:
Важно знать, позволяет ли используемый язык программирования передавать переменные по значению и/или по ссылке. Например, Java и Scala не позволяют передавать переменные по ссылке. C, C++, C#, Visual Basic и другие допускают оба типа передачи переменных.
Важно: передачу ссылки не следует путать с передачей значения ссылки. Последнее означает, что передается копия ссылки, однако позволяет редактировать состояние ссылки, на которую ссылается параметр (простите за избыточность).