• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Referencja a zwykła kopia, dla was pewnie drobnostka, a dla mnie zagwozdka

Fiszki IT
Fiszki IT
0 głosów
128 wizyt
pytanie zadane 27 listopada 2019 w C i C++ przez Deeright Początkujący (380 p.)

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;
}

 

2 odpowiedzi

0 głosów
odpowiedź 27 listopada 2019 przez Inn Gaduła (3,040 p.)

Nazwa tablicy jest wskaźnikiem do jej pierwszego elementu.
Tablice przekazywane do funkcji nigdy nie są kopiowane.

komentarz 27 listopada 2019 przez Deeright Początkujący (380 p.)
Dziękuję bardzo
0 głosów
odpowiedź 27 listopada 2019 przez k222 Nałogowiec (29,230 p.)

Referencję rozumiesz dobrze, problem w tym że działa to dla int, string, double, ale tablica to już zupełnie inna bajka. Tablica jest zawsze wysyłana przez referencję - zapamiętaj, nazwa tablicy jest jednocześnie wskaźnikiem (referencją) do jej pierwszego elementu. Dzieje się tak o ile wiem, bo C++ bazuje na C, a tam nie ma referencji, tylko są wskaźniki, więc coś takiego:

void func(int[] t);

zamieniane jest na:

void func(int* t);

a wywołując pisząc:

func(tab);

kompilator rozumie:

func(&tab[0]);

dzięki temu z jednej strony musisz uważać, z drugiej nie kopiujesz tablicy mającej powiedzmy 100 000 elementów przy każdym wywołaniu funkcji na niej

komentarz 27 listopada 2019 przez Deeright Początkujący (380 p.)
Już wszystko rozumiem, dobrze, że mi to wyjaśniliście...
komentarz 27 listopada 2019 przez tkz Nałogowiec (39,540 p.)
Referencja to nie to samo co wskaźnik! Różnią się, nie możesz używać tych słów na zmianę,
komentarz 28 listopada 2019 przez j23 Mędrzec (164,180 p.)

@k222,

nazwa tablicy jest jednocześnie wskaźnikiem (referencją) do jej pierwszego elementu.

No nie do końca. Nazwa tablicy oznacza tablicę. Może się wydawać, że to wskaźnik, bo tablica jest niejawnie konwertowana do wskaźnika na pierwszy element.

Podobne pytania

0 głosów
2 odpowiedzi 780 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
4 odpowiedzi 719 wizyt
pytanie zadane 21 lutego 2017 w C i C++ przez Danthee Początkujący (260 p.)
0 głosów
2 odpowiedzi 10,701 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

84,751 zapytań

133,554 odpowiedzi

295,978 komentarzy

56,010 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...