C – Wskaźnik do wskaźnika (podwójny wskaźnik)
Warunek wstępny: Wskaźniki w C
Wskaźnik do wskaźnika w C jest używany, gdy chcemy przechowywać adres innego wskaźnika. Pierwszy wskaźnik służy do przechowywania adresu zmiennej. Drugi wskaźnik służy do przechowywania adresu pierwszego wskaźnika. Dlatego są również znane jako podwójne wskazówki . Możemy użyć wskaźnika do wskaźnika, aby zmienić wartości normalnych wskaźników lub utworzyć tablicę 2-D o zmiennej wielkości. Podwójny wskaźnik zajmuje tę samą ilość miejsca na stosie pamięci, co normalny wskaźnik.
Deklaracja wskaźnika na wskaźnik w C
Deklarowanie wskaźnika na wskaźnik jest podobne do deklarowania wskaźnika w C. Różnica polega na tym, że przed nazwą wskaźnika musimy umieścić dodatkowy znak „*”.
data_type_of_pointer **name_of_variable = & normal_pointer_variable;
int val = 5; int *ptr = &val; // storing address of val to pointer ptr. int **d_ptr = &ptr; // pointer to a pointer declared // which is pointing to an integer.
Powyższy diagram przedstawia reprezentację wskaźnika do wskaźnika w pamięci. Pierwszy wskaźnik ptr1 przechowuje adres zmiennej, a drugi wskaźnik ptr2 przechowuje adres pierwszego wskaźnika.
Przykład podwójnego wskaźnika w C
C
// C program to demonstrate pointer to pointer> #include> int> main()> {> > int> var = 789;> > // pointer for var> > int> * ptr2;> > // double pointer for ptr2> > int> ** ptr1;> > // storing address of var in ptr2> > ptr2 = &var;> > // Storing address of ptr2 in ptr1> > ptr1 = &ptr2;> > // Displaying value of var using> > // both single and double pointers> > printf> (> 'Value of var = %d
'> , var);> > printf> (> 'Value of var using single pointer = %d
'> , *ptr2);> > printf> (> 'Value of var using double pointer = %d
'> , **ptr1);> > return> 0;> }> |
Wyjście
Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789
Jak działa podwójny wskaźnik?
Działanie podwójnego wskaźnika można wyjaśnić na powyższym obrazku:
- Podwójny wskaźnik jest deklarowany przy użyciu składni pokazanej powyżej.
- Następnie przechowujemy adres innego wskaźnika jako wartość tego nowego podwójnego wskaźnika.
- Teraz, jeśli chcemy manipulować lub odwoływać się do któregokolwiek z jego poziomów, musimy użyć operatora gwiazdki ( * ) tyle razy, ile razy chcemy przejść w dół poziomu.
Rozmiar wskaźnika do wskaźnika w C
W języku programowania C podwójny wskaźnik zachowuje się podobnie do normalnego wskaźnika w C. Zatem rozmiar zmiennej o podwójnym wskaźniku jest zawsze równy normalnym wskaźnikom. Możemy to zweryfikować za pomocą poniższego programu C.
Przykład 1: Program w C obliczający rozmiar wskaźnika do wskaźnika.
C
// C program to find the size of pointer to pointer> #include> int> main()> {> > // defining single and double pointers> > int> a = 5;> > int> * ptr = &a;> > int> ** d_ptr = &ptr;> > // size of single pointer> > printf> (> ' Size of normal Pointer: %d
'> ,> sizeof> (ptr));> > // size of double pointer> > printf> (> ' Size of Double Pointer: %d
'> ,> sizeof> (d_ptr));> > return> 0;> }> |
Wyjście
Size of normal Pointer: 8 Size of Double Pointer: 8
Notatka: Wynik powyższego kodu zależy również od typu używanej maszyny. Rozmiar wskaźnika nie jest ustalony w języku programowania C i zależy od innych czynników, takich jak architektura procesora i używany system operacyjny. Zwykle w przypadku 64-bitowego systemu operacyjnego rozmiar będzie wynosić 8 bajtów, a w przypadku 32-bitowego systemu operacyjnego rozmiar będzie wynosić 4 bajty.
Zastosowanie podwójnych wskaźników w C
Poniżej przedstawiono główne zastosowania wskaźnika do wskaźników w C:
- Wykorzystuje się je do dynamicznej alokacji pamięci tablic wielowymiarowych.
- Można ich używać do przechowywania danych wielopoziomowych, takich jak akapit dokumentu tekstowego, zdania i semantyka słów.
- Są używane w strukturach danych do bezpośredniego manipulowania adresami węzłów bez kopiowania.
- Można ich używać jako argumentów funkcji do manipulowania adresem przechowywanym we wskaźniku lokalnym.
Wskaźniki wielopoziomowe w C
Podwójne wskaźniki nie są jedynymi wskaźnikami wielopoziomowymi obsługiwanymi przez język C. A co jeśli chcemy zmienić wartość podwójnego wskaźnika?
W tym przypadku możemy zastosować potrójny wskaźnik, który będzie wskaźnikiem do wskaźnika do wskaźnika, czyli int ***t_ptr.
Składnia potrójnego wskaźnika
pointer_type *** pointer_name;
Podobnie, aby zmienić wartość potrójnego wskaźnika, możemy użyć wskaźnika do wskaźnika do wskaźnika do wskaźnika (wskaźnik czteropoziomowy). Innymi słowy, możemy powiedzieć, że do zmiany wartości zmiennej poziom – x możemy użyć wskaźnika poziomu – x+1. I tę koncepcję można rozszerzyć dalej.
Notatka : W C możemy używać dowolnego wskaźnika poziomu. Nie ma co do tego żadnych ograniczeń, ale sprawia to, że program jest bardzo złożony i podatny na błędy.
Musisz przeczytać - Wskaźnik funkcji w C