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;> }> |
>
hashset vs hashmap
>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