Tablice i wskaźniki
1. Podstawowa zależność
- Nazwa tablicy w C++ reprezentuje wskaźnik na jej pierwszy element.
- Można więc używać wskaźników do pracy z tablicami zamiast klasycznego indeksowania.
Przykład:
2. Indeksowanie a wskaźniki
Każdy element tablicy można odczytać na dwa sposoby:
Przykład:
Mechanizm: tab wskazuje na tab[0]. Dodanie i przesuwa wskaźnik o i elementów (uwzględniając rozmiar typu).
3. Arytmetyka wskaźników na tablice
Wskaźnik można przesuwać o kolejne elementy tablicy:
Ważne: przesuwanie wskaźnika poza zakres tablicy prowadzi do niezdefiniowanego zachowania.
4. Tablice jako argumenty funkcji
Kiedy przekazujemy tablicę do funkcji, w rzeczywistości przekazujemy wskaźnik do jej pierwszego elementu.
Forma 1 – jawny wskaźnik:
Forma 2 – składnia tablicowa (równoważna):
Oba zapisy są równoważne – funkcja dostaje wskaźnik.
5. Tablice wielowymiarowe a wskaźniki
Tablica 2D to tablica tablic.
Przykład:
Dostęp wskaźnikowy:
*(*(macierz+1)+2)≡macierz[1][2]→6
Schemat myślowy:
macierz→ wskaźnik do wiersza 0 (int[3])*(macierz+1)→ wskaźnik do wiersza 1*(*(macierz+1)+2)→ element wiersza 1, kolumna 2
6. Tablice dynamiczne i wskaźniki
Tablice dynamiczne można utworzyć za pomocą wskaźnika i operatora new[].
Zalety:
- elastyczny rozmiar (określany w runtime). Wady:
- ręczne zarządzanie pamięcią (łatwo o wyciek).
7. Wskaźnik do tablicy a wskaźnik na element
Warto rozróżniać:
int *p– wskaźnik na pojedynczy element typuint(np.p = &tab[0]).int (*p)[10]– wskaźnik na tablicę 10-elementową typuint.
Przykład:
8. Różnice między tablicą a wskaźnikiem
| Cecha | Tablica | Wskaźnik |
|---|---|---|
| Deklaracja | int tab[5]; |
int *p; |
| Rozmiar | stały, znany w kompilacji | dynamiczny (można używać new) |
| Zawartość | przechowuje elementy | przechowuje adres |
| Przypisanie | tab = inna_tab; – błąd |
p = inny_adres; – OK |
| Funkcje | przekazywana jako wskaźnik | naturalnie przekazuje adres |
9. Typowe błędy
- Przekroczenie zakresu tablicy:
- Użycie niezainicjalizowanego wskaźnika:
- Brak delete[] przy tablicach dynamicznych.