logo

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.

reprezentacja-pamięci-tablicy-ciągów

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