Poziom trzeci "Przekazywanie argumentów funkcji przez referencję (lekcja)"
Ostatnio zmodyfikowano 2019-11-27 19:31
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; } |
|
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. #include <iostream>
void f( int t[] ) { std::cout << "Rozmiar tablicy w bajtach: " << sizeof t << '\n'; }
void g( int( & t )[ 100 ] ) { 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. |
|
Cornel9192 Temat założony przez niniejszego użytkownika |
» 2019-11-27 19:31:58 ok wszystko wyjaśniłeś, dziękuję bardzo! |
|
« 1 » |