• 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

VPS Starter Arubacloud
0 głosów
288 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,167 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
4 odpowiedzi 1,126 wizyt
pytanie zadane 21 lutego 2017 w C i C++ przez Danthee Początkujący (260 p.)
0 głosów
2 odpowiedzi 14,799 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...