4.1. DYNAMICZNA ALOKACJA PAMIĘCI
Przykład z rozdz. 3 (cd.). W poprzednim rozdziale rozważaliśmy funkcję, która służyła do zamiany wartości dwóch zmiennych całkowitych. Przypomnijmy, że prawidłowe rozwiązanie tego problemu wymagało użycia nie argumentów przekazanych przez wartość, ale przez referencję. Równie skutecznym, acz w tym wypadku może nieco mniej eleganckim, jest użycie w tym przypadku wskaźników.
void zamień(int* x, int* y) { int t = *x;
>
int mainO {
int n = 1, m = 2;
zamień (&n, &m) ; // przekazanie argumentów przez wskaźnik cout << n << ", " << m << endl; return 0;
}
Dzięki temu, że przekazaliśmy funkcji zamień O adresy zmiennych zadeklarowanych w funkcji mainO, możemy nie tylko odczytywać, ale i nadpisywać tutaj ich wartości. Ominęliśmy tym samym ograniczenia przekazywania argumentów przez wartość (kopiowanie) — dostęp do „oryginalnych” zmiennych mamy tutaj w sposób pośredni, tj. za pomocą operatora wyłuskania *. ■
Ciekawostka_
Pamiętamy, że aby dostać się do konkretnego pola struktury, należy użyć operatora (kropki). Jeśli mamy dostęp do wskaźnika na strukturę, możemy użyć do tego celu operatora
struct Punkt |
{ | ||||
double x; double y; | |||||
>; | |||||
// •• ■ (np. Punkt p; |
m’tr |
o> ... | |||
Punkt* wp = |
&p; |
// wskaźnik |
na p | ||
wp—>x = 1.0; |
// |
to samo, co |
(*wp) ,x = 1.0 |
drugie /7 |
niej wygodne |
wp— >y = 2.0; |
// |
to samo, co |
(*wp) . y = 2.0 |
4.1.3. Przydział i zwalnianie pamięci ze sterty
Oprócz ściśle określonej na etapie pisania programu ilości danych na stosie, można również dysponować pamięcią na stercie, por. s. 1. Miejsce na nasze dane może być przydzielane (alokowane) dynamicznie podczas działania programu za pomocą operatora new. Po użyciu należy je zwolnić za pomocą operatora delete.
Ostatnia aktualizacja: 5 grudnia 2012 r.