• 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

Object Storage Arubacloud
0 głosów
290 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 (4,300 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 (30,150 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 (42,000 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 (194,920 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 1,175 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
4 odpowiedzi 1,141 wizyt
pytanie zadane 21 lutego 2017 w C i C++ przez Danthee Początkujący (260 p.)
0 głosów
2 odpowiedzi 14,850 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...