Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Poziom trzeci "Przekazywanie argumentów funkcji przez referencję (lekcja)"

Ostatnio zmodyfikowano 2019-11-27 19:31
Autor Wiadomość
Cornel9192
Temat założony przez niniejszego użytkownika
Poziom trzeci "Przekazywanie argumentów funkcji przez referencję (lekcja)"
» 2019-11-27 18:31:37
Cześć. Mam pytanie, jak to w końcu z tą referencją jest bo rozumiem, bardzo prosto - referencją zmieniamy oryginał (nie wysyłamy kopii tylko inną nazwę, ale ta nazwa wskazuje na miejsce oryginału i na nim bazujemy.
Jeśli wysyłamy normalnie to pracujemy na kopii. To czemu w tym programie jak wysyłam tablicę (jako kopię, nie referencję) to każda z funkcji coś w niej zmienia, a wszystko jest jakby działo się na oryginale. Dokładniej opiszę:
1. wysyłam do funkcji wylosujLiczby() kopię tablicy, w tej kopii dokonywane jest wpisywanie liczb, funkcja nawet nic nie zwraca.
2. znów wysyłąm kopię tablicy do funkcji wypiszLiczby(), skąd ta funkcja ma dane z wylosujLiczby() skoro kopia jest znana tylko w granicy danej funkcji?
3. funkcja obliczSume() znowu ma dostęp do kopii, która była edytowana w pierwszej funkcji, więc jakim cudem oblicza te sume?

Kod niżej:

#include <cstdlib>
#include <ctime>

using namespace std;

void wylosujLiczby(int t[], int r, int start, int zakres)
{
    srand( time( NULL ) );
    for(int i=0;i<r;i++){
        t=(rand() % zakres) + start;
    }
}

void wypiszLiczby(int t[], int r)
{
     for(int i=0;i<r;i++){
        cout << "[" << i << "] = " << t << endl;
    }
    cout << endl;
}

int obliczSume(int t[], int r)
{
    int suma;
    for(int i=0;i<r;i++){
        suma+=t;
    }
    return suma;
}

int main()
{
    int tablica[ 999 ];
    wylosujLiczby( tablica, 999, 4, 7 );
    wypiszLiczby( tablica, 999 );
    int iSuma = obliczSume( tablica, 999 );
    cout << "Suma liczb wynosi: " << iSuma << endl;

    return 0;
}
P-175672
pekfos
» 2019-11-27 18:38:15
To czemu w tym programie jak wysyłam tablicę (jako kopię, nie referencję)
Tablicy nie da się przekazać przez kopię1.
C/C++
#include <iostream>

void f( int t[] ) // Nawet nie tablica!
{
    std::cout << "Rozmiar tablicy w bajtach: " << sizeof t << '\n';
}

void g( int( & t )[ 100 ] ) // Tablica przez referencję
{
    std::cout << "Rozmiar tablicy w bajtach: " << sizeof t << '\n';
}

int main()
{
    int t[ 100 ];
    f( t );
    g( t );
}
Rozmiar tablicy w bajtach: 8
Rozmiar tablicy w bajtach: 400
Domyślnie przekazywany jest wskaźnik na pierwszy element tablicy, a nie tablica per se. Tablica ma rozmiar, który jest znany w czasie kompilacji, a zapis z f() pozwala przekazać dowolną tablicę. W przypadku referencji, rozmiar jest na stałe uwiązany do funkcji i nie da się przekazać innego rozmiaru.

1 W zasadzie da się przekazać kopię tablicy, jeśli opakujesz ją w typ złożony. Jedną wartość możesz przekazać przez wartość (kopię) i siłą rzeczy tablica w środku też musi zostać skopiowana, ale nie rób tak z większymi tablicami, bo bardzo łatwo przepełnisz stos.
P-175673
Cornel9192
Temat założony przez niniejszego użytkownika
» 2019-11-27 19:31:58
ok wszystko wyjaśniłeś, dziękuję bardzo!
P-175676
« 1 »
  Strona 1 z 1