Tablica wskaźników w C
W języku C tablica wskaźników jest jednorodnym zbiorem indeksowanych zmiennych wskaźnikowych, które są odniesieniami do lokalizacji w pamięci. Jest powszechnie używany w programowaniu C, gdy chcemy wskazać wiele lokalizacji pamięci o podobnym typie danych w naszym programie C. Dostęp do danych możemy uzyskać poprzez wyłuskanie wskaźnika wskazującego na nie.
Składnia:
pointer_type *array_name [array_size];
Tutaj,
- pointer_type: Typ danych, na które wskazuje wskaźnik. array_name: Nazwa tablicy wskaźników. array_size: Rozmiar tablicy wskaźników.
Notatka: Ważne jest, aby pamiętać o pierwszeństwie operatorów i skojarzeniu w tablicy deklaracji wskaźników różnego typu, ponieważ pojedyncza zmiana będzie oznaczać zupełnie co innego. Na przykład umieszczenie *nazwa_tablicy w nawiasie będzie oznaczać, że nazwa_tablicy jest wskaźnikiem do tablicy.
Przykład:
C
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
Wyjście
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
Wyjaśnienie:
Jak pokazano w powyższym przykładzie, każdy element tablicy jest wskaźnikiem wskazującym na liczbę całkowitą. Dostęp do wartości tych liczb całkowitych możemy uzyskać, wybierając najpierw element tablicy, a następnie wyłuskując go, aby uzyskać wartość.
Tablica wskaźników do znaku
Jednym z głównych zastosowań tablicy wskaźników jest przechowywanie wielu ciągów znaków jako tablicy wskaźników do znaków. W tym przypadku każdy wskaźnik w tablicy jest wskaźnikiem znakowym wskazującym na pierwszy znak ciągu.
Składnia:
char *array_name [array_size];
Następnie do tych wskaźników możemy przypisać ciąg o dowolnej długości.
Przykład:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
Ta metoda przechowywania ciągów ma tę zaletę, że ma przewagę nad tradycyjną tablicą ciągów. Rozważ następujące dwa przykłady:
Przykład 1:
C
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
Wyjście
String array Elements are: Geek Geeks Geekfor
W powyższym programie zadeklarowaliśmy 3 wiersze i 10 kolumn naszej tablicy ciągów. Jednak ze względu na z góry określony rozmiar tablicy ciągów, zużycie miejsca przez program wzrasta, jeśli pamięć nie jest właściwie wykorzystywana lub pozostaje nieużywana. Spróbujmy teraz zapisać te same ciągi znaków w tablicy wskaźników.
Przykład 2:
C
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
Wyjście
geek Geeks Geeksfor
W tym przypadku całkowita używana pamięć to pamięć wymagana do przechowywania ciągów znaków i wskaźników bez pozostawiania pustej przestrzeni, co pozwala zaoszczędzić dużo zmarnowanego miejsca. Możemy to zrozumieć, korzystając z obrazu pokazanego poniżej.
Przestrzeń zajmowana przez tablicę wskaźników do znaków jest pokazana jako ciągłe zielone bloki, z wyłączeniem pamięci potrzebnej do przechowywania wskaźnika, podczas gdy przestrzeń zajmowana przez tablicę ciągów znaków obejmuje zarówno ciągłe, jak i jasnozielone bloki.
Tablica wskaźników do różnych typów
Nie tylko możemy zdefiniować tablicę wskaźników dla podstawowych typów danych, takich jak int, char, float itp., ale możemy również zdefiniować je dla pochodnych i zdefiniowanych przez użytkownika typów danych, takich jak tablice, struktury itp. Rozważmy poniższy przykład, w którym tworzymy tablicę wskaźników wskazujących na funkcję wykonującą różne operacje.
Przykład:
C
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
Wyjście
Sum : 55 Difference : 45 Product : 250 Quotient : 10
Zastosowanie tablicy wskaźników
Tablica wskaźników jest przydatna w wielu przypadkach. Niektóre z tych aplikacji są wymienione poniżej:
- Najczęściej używany jest do przechowywania wielu ciągów znaków.
- Jest również używany do implementacji LinkedHashMap w C, a także w technice Chaining do rozwiązywania kolizji w Hashing.
- Jest używany w algorytmach sortowania, takich jak sortowanie kubełkowe.
- Można go używać z dowolnym typem wskaźnika, więc jest przydatny, gdy mamy osobne deklaracje wielu encji i chcemy przechowywać je w jednym miejscu.
Wady tablicy wskaźników
Zestaw wskaźników ma również sporo wad i powinien być stosowany, gdy zalety przeważają nad wadami. Niektóre z wad tablicy wskaźników to:
- Wyższe zużycie pamięci: Tablica wskaźników wymaga więcej pamięci w porównaniu do zwykłych tablic ze względu na dodatkową przestrzeń wymaganą do przechowywania wskaźników. Złożoność: tablica wskaźników może być skomplikowana w użyciu w porównaniu z prostą tablicą. Podatny na błędy: gdy używamy wskaźników, towarzyszą im wszystkie błędy związane ze wskaźnikami, dlatego musimy się z nimi obchodzić ostrożnie.
Powiązany artykuł: Wskaźnik do tablicy | Wskaźnik tablicy