Функции — одна из замечательных вещей для создания чистого и читаемого кода, но когда дело доходит до манипулирования данными, разработчик или программист должен хорошо знать поведение используемого языка программирования.
В этом отношении при работе с данными есть две вещи, о которых мы должны знать: область действия переменных (время жизни переменных в программе) и передача по значению по сравнению с передачей по ссылке/адресу. Взяв, к примеру, язык программирования C, когда мы объявляем переменную, ее область действия определяется в программе в зависимости от того, где мы ее объявили.
1. Передача по значению
Итак, давайте возьмем следующий пример:
Запустив программу выше, мы получим вывод:
- Начальное значение a: 42
- Значение внутренней функции passByValue: 126
- Значение a: 42
Начальное значение a равно 42, так как это число, которое мы присвоили переменной в основной функции, затем мы вызываем функцию passByValue и получаем оператор печати, показывающий значение a внутри функции, равной 126, а затем мы печатаем a после вызов функции, но значение по-прежнему 42!
Это называется передачей по значению, поскольку мы берем значение или, как мы можем сказать, копию переменной и изменяем ее внутри локальной области видимости (образовательной, n.d), которая в нашем случае является функцией passByValue; где значение a было умножено на 3, но только внутри функции, а не в глобальной области.
Здесь есть недостаток, заключающийся в том, что изменения, которые мы склонны применять к данным, не будут происходить глобально после вызова функции. Поэтому решение состоит в том, чтобы сохранить выходные данные функции в переменной и переопределить значение a; Но это не очень хорошее решение, так как в случае большого проекта вы получите множество переопределений и спагетти-код, в то время как вместо этого вы можете использовать передачу по адресу и применять изменения в глобальной области, поэтому переопределение может быть одним. время, которое вы можете использовать для небольшого изменения, а не для большого программного обеспечения.
2. Передача по ссылке
Теперь давайте взглянем на ту же программу с небольшими изменениями:
Запустив программу выше, мы получим вывод:
- Начальное значение a: 42
- Значение внутренней функции passByReference: 126
- Значение a: 126
Мы можем заметить, что начальное значение a равно 42, так как это число, которое мы присвоили переменной в основной функции, затем мы вызываем функцию passByReference и получаем оператор печати показывая значение a внутри функции, которое равно 126, а затем мы печатаем a после вызова функции и значение изменилось с 42 на 126!
Это называется передачей по ссылке или передачей по адресу, поскольку мы глобально изменяем значение переменной. Другими словами, мы идем по адресу (области памяти), где хранится переменная, и меняем ее значение. Следовательно, значение переменной меняется во всей программе или, как мы можем сказать, в глобальной области видимости (познавательной, н.д.)
Вот почему после вызова passByAddress новое значение a стало 126, поскольку оно изменилось глобально. Здесь есть недостаток потери данных, поскольку передача по ссылке изменяет значение переменной в ее адресе, поэтому исходные данные теряются.
Ссылки:
- воспитательный. (н.д). Передача по значению против передачи по ссылке. Получено с https://www.educative.io/edpresso/pass-by-value-vs-pass-by-reference