Tablice 221
Rozpatrzmy trzy różne deklaracje:
1: KOT RodzinaJeden[500];
2: KOT *RodzinaDwa[500];
3: KOT *RodzinaTrzy = new KOT[500];
RodzinaJeden to tablica 500 obiektów klasy KOT. RodzinaDwa to tablica 500 wskaźników do obiektów klasy KOT. RodzinaTrzy to wskaźnik do tablicy 500 obiektów klasy KOT.
Różnice między tymi trzema deklaracjami powoduję skrajnie różne metody ich obsługi. Można powiedzieć, że RodzinaTrzy jest wariantem RodzinaJeden i są one całkowicie różne od tablicy RodzinaDwa.
Widać, jak wskaźniki odnoszą się do tablic. W trzecim przypadku, RodzinaTrzy jest wskaźnikiem do tablicy. Oznacza to, że adres zawarty we wskaźniku RodzinaTrzy jest adresem pierwszego elementu tablicy. Podobnie jest w przypadku tablicy RodzinaJeden.
W C++- nazwa tablicy jest jednocześnie nazwą stałego wskaźnika na pierwszy element tej tablicy. W deklaracji:
KOT Rodzina[50];
Rodzina jest wskaźnikiem do &Rodzina[0], czyli adresem pierwszego elementu w tablicy Rodzina.
Nazwa tablicy może być wykorzystywana jako stały wskaźnik i na odwrót. Oznacza to, że np. Rodzina + 4 będzie znaczyło to samo co Rodzina [4].
Kompilator odpowiada za właściwą obsługę arytmetyki przy dodawaniu, inkremen-tacji lub dekrementacji wskaźników. Adres będący wynikiem dodawania Rodzina + 4 nie jest adresem czwartego bajtu począwszy od początku tablicy, lecz adresem 4 elementu tablicy. Jeśli każdy element ma 4 bajty to Rodzina + 4 oznacza przesunięcie o 16 bajtów względem początku tablicy. Jeżeli obiekt klasy KOT zajmowałby 20 bajtów (np. 4 zmienne typu long i 2 zmienne typu short) to Rodzina + 4 oznaczałoby przesunięcie o 80 bajtów.
Listing 15.5. ilustruje zasady tworzenia i wykorzystywania tablic na stercie.
Listing 15.5. Tworzenie tablicy z wykorzystaniem new
) ----------------------------------------------------------------------—
1: // Listing 15.5 - Tablica na stercie
2:
3: #include <iostream.h>
4:
5: class KOT
Rozpatrzmy trzy różne deklaracje:
1: KOT RodzinaJeden[500];
2: KOT *RodzinaDwa[500];
3: KOT *RodzinaTrzy = new KOT[500];
RodzinaJeden to tablica 500 obiektów klasy KOT. RodzinaDwa to tablica 500 wskaźników do obiektów klasy KOT. RodzinaTrzy to wskaźnik do tablicy 500 obiektów klasy KOT.
Różnice między tymi trzema deklaracjami powoduję skrajnie różne metody ich obsługi. Można powiedzieć, że RodzinaTrzy jest wariantem RodzinaJeden i są one całkowicie różne od tablicy RodzinaDwa.
Widać, jak wskaźniki odnoszą się do tablic. W trzecim przypadku, RodzinaTrzy jest wskaźnikiem do tablicy. Oznacza to, że adres zawarty we wskaźniku RodzinaTrzy jest adresem pierwszego elementu tablicy. Podobnie jest w przypadku tablicy RodzinaJeden.
W C++ nazwa tablicy jest jednocześnie nazwą stałego wskaźnika na pierwszy element tej tablicy. W deklaracji:
KOT Rodzina[50];
Rodzina jest wskaźnikiem do &Rodzina[0], czyli adresem pierwszego elementu w tablicy Rodzina.
Nazwa tablicy może być wykorzystywana jako stały wskaźnik i na odwrót. Oznacza to, że np. Rodzina + 4 będzie znaczyło to samo co Rodzina [4 ],
Kompilator odpowiada za właściwą obsługę arytmetyki przy dodawaniu, inkremen-tacji lub dekrementacji wskaźników. Adres będący wynikiem dodawania Rodzina + 4 nie jest adresem czwartego bajtu począwszy od początku tablicy, lecz adresem 4 elementu tablicy. Jeśli każdy element ma 4 bajty to Rodzina + 4 oznacza przesunięcie o 16 bajtów względem początku tablicy. Jeżeli obiekt klasy KOT zajmowałby 20 bajtów (np. 4 zmienne typu long i 2 zmienne typu short) to Rodzina + 4 oznaczałoby przesunięcie o 80 bajtów.
Listing 15.5. ilustruje zasady tworzenia i wykorzystywania tablic na stercie.
Listing 15.5. Tworzenie tablicy z wykorzystaniem new
1: // Listing 15.5 - Tablica na stercie
2:
3: #include <iostream.h>
4:
5: class KOT