Sobes.tech
Junior

Čo je to odovzdanie odkazom?

sobes.tech AI

Odpoveď od AI

Prenos odkazom (pass by reference) je mechanizmus, pri ktorom sa funkciiou sa odovzdáva adresa (odkaz) na oblasť pamäti, kde sú uložené údaje argumentu. V dôsledku toho akékoľvek zmeny vykonané na premennej vo vnútri funkcie sa odrazia na pôvodnej premennej mimo nej.

Hlavné vlastnosti:

  • Odovzdáva sa adresa pamäti, nie kópia hodnoty.
  • Funkcia pracuje priamo s pôvodnými údajmi.
  • Zmeny vo vnútri funkcie pretrvávajú po jej ukončení.
  • Toto je použiteľné na objekty, polia a iné referenčné typy údajov v mnohých programovacích jazykoch.
  • V niektorých jazykoch (napríklad C++) je možné explicitne odovzdať primitívne typy odkazom pomocou ukazovateľov alebo odkazov.

Príklad kódu v Pythone:

# Odovzdanie zoznamu (referenčný typ)
def modify_list(my_list):
    my_list.append(4) # Zmena pôvodného zoznamu

data = [1, 2, 3]
modify_list(data)
print(data) # Vypíše [1, 2, 3, 4]

# Odovzdanie čísla (primitívny typ - odovzdanie hodnotou v Pythone)
def modify_number(my_number):
    my_number += 1 # Vytvorí sa lokálna kópia, ktorá sa mení

value = 5
modify_number(value)
print(value) # Vypíše 5 - pôvodná hodnota sa nezmenila

Príklad kódu v C++:

#include <iostream>

// Odovzdanie odkazom
void modify_value_ref(int &val) {
    val += 10; // Zmena pôvodnej premennej
}

// Odovzdanie hodnotou (pre porovnanie)
void modify_value_copy(int val) {
    val += 10; // Zmena lokálnej kópie
}

int main() {
    int a = 5;
    modify_value_ref(a);
    std::cout << "Po odkaze: " << a << std::endl; // Vypíše 15

    int b = 5;
    modify_value_copy(b);
    std::cout << "Po kópii: " << b << std::endl; // Vypíše 5

    return 0;
}

Výhody:

  • Efektívne pri práci s veľkými objemami dát, pretože nie je potrebné kopírovanie.
  • Umožňuje funkciám meniť viacero hodnôt prostredníctvom argumentov.

Nevýhody:

  • Môže spôsobiť, že kód bude menej predvídateľný, ak funkcia mení argumenty bez jasného označenia v názve alebo dokumentácii.
  • Vyžaduje opatrnosť, aby sa predišlo neželaným vedľajším efektom.