Przekazywanie tablicy struktur przez odwołanie w C ++
Więc nadal jestem całkiem nowy w programowaniu/C ++ i wciąż próbuję zawinąć głowę wokół wskaźników, przeszłych odniesień i wszystkiego innego. Program, który teraz próbuję zrozumieć, musi przekazać tablicę struktur do innej funkcji. Zrobiłem to, po prostu przekazując tablicę właśnie tam. Wydaje się, że wszystko działa dobrze. Martwi mnie jednak to, że uważam, że przekazuję to według wartości i rozumiem, że lepiej jest przekazywać struktury przez odniesienie, aby nie tworzyć kopii struktury za każdym razem ...
W każdym razie, oto podstawowy przykład tego, co robię:
struct GoldenHelmet {
int foo;
string bar;
};void pass (GoldenHelmet ofMambrino[], int size);int main () {
GoldenHelmet ofMambrino[10];
int size = sizeof(ofMambrino)/sizeof(ofMambrino[0]);
ofMambrino[1].foo = 1;
pass(ofMambrino, size);
cout << ofMambrino[2].foo << endl;
return 0;
}void pass (GoldenHelmet ofMambrino[], int size) {
ofMambrino[2].foo = 100;
ofMambrino[2].bar = "Blargh";
}
Jak rozumiem, to działa, ponieważ tablice są już wskaźnikami, prawda? Ale sposób, w jaki to skonfigurowałem, czy nadal przekazuję kopię struktury i wszystkiego innego do funkcji pass ()? Próbowałem przekazać to przez odniesienie, ale wydaje się, że nie chce działać tak, jak próbowałem.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Rzeczywiście, przekazujemy tablicę przez odniesienie.
Anonimowy użytkownik
Potwierdzenie od:
void pass (GoldenHelmet ofMambrino[], int size)
to właściwie dość zagmatwane. Ponieważ nie przekazujesz tablicy, przekazujesz wskaźnik. Ale to nie to samo, nie dajcie się zmylić. Ta dziwność dotyczy tylko parametrów funkcji. Powyższe jest dokładnie takie samo:
Przekazanie tablicy według wartości nie jest naprawdę możliwe, chyba że jest to podobiekt innego obiektu. Możesz przekazać je przez odniesienie, chociaż musisz podać rozmiar, ale możesz to zrobić za pomocą szablonu:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
jeden
, zostanie przekazana przez wartość.
Poniżej znajduje się fragment kodu ilustrujący ten ostatni punkt:
Anonimowy użytkownik
Potwierdzenie od:
int x[ ]
x jest właściwie wskaźnikiem do stałej, który wskazuje na początek tablicy. A kiedy przekazujesz to do funkcji, wysyłasz adres pamięci, która jest początkiem tablicy. Dlatego, kiedy wprowadzasz zmiany w swojej funkcji, w rzeczywistości wprowadzasz zmiany w adresie swojej zmiennej w sekcji wywołującej. W rzeczywistości jest to symulowane połączenie przez odniesienie, a nie połączenie przez odniesienie. Ale efekt jest taki sam, jak wywołanie przez odniesienie, ponieważ pracujesz z lokalizacjami pamięci. Z tego powodu, kiedy wysyłasz tablicę swojej struktury, przekazujesz rzeczywisty adres swojej tablicy struktur. Dlatego zmieniając wartość tego, w rzeczywistości zmieniasz swoje struktury.
Aby użyć wywołania przez odniesienie, jedną rzeczą, którą musisz zrobić, jest zdefiniowanie prototypu funkcji w ten sposób
a kiedy wywoływana jest funkcja, to samo dzieje się z innymi.
Zreasumowanie: