logo

Pole ukazatelů v C

V jazyce C je pole ukazatelů homogenní kolekce indexovaných ukazatelových proměnných, které jsou odkazy na umístění v paměti. Obecně se používá v programování C, když chceme ukázat na více paměťových míst podobného typu dat v našem programu C. K datům můžeme přistupovat dereferencováním ukazatele, který na ně ukazuje.

Syntax:



pointer_type *array_name [array_size];>

Tady,

    pointer_type: Typ dat, na která ukazatel ukazuje. pole_name: Název pole ukazatelů. array_size: Velikost pole ukazatelů.

Poznámka: Je důležité mít na paměti prioritu a asociativitu operátorů v poli deklarací ukazatelů různého typu, protože jedna změna bude znamenat úplně jinou věc. Například uzavření *název_pole v závorce bude znamenat, že název_pole je ukazatel na pole.

Příklad:



C




q1 q2 q3 q4



// 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;> }>

>

>

Výstup

Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c>

Vysvětlení:

Jak je ukázáno ve výše uvedeném příkladu, každý prvek pole je ukazatel ukazující na celé číslo. K hodnotě těchto celých čísel můžeme přistupovat tak, že nejprve vybereme prvek pole a poté jej dereferencujeme, abychom získali hodnotu.

Pole ukazatelů na charakter

Jednou z hlavních aplikací pole ukazatelů je ukládání více řetězců jako pole ukazatelů na znaky. Zde je každý ukazatel v poli ukazatel na znak, který ukazuje na první znak řetězce.

Syntax:

matematika náhodná java
char *array_name [array_size];>

Poté můžeme těmto ukazatelům přiřadit řetězec libovolné délky.

Příklad:

C




char>* arr[5]> >= {>'gfg'>,>'geek'>,>'Geek'>,>'Geeks'>,>'techcodeview.com'> }>

>

>


Tento způsob ukládání řetězců má výhodu tradičního pole řetězců. Zvažte následující dva příklady:

Příklad 1:

C




np std

// 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;> }>

>

>

Výstup

String array Elements are: Geek Geeks Geekfor>

Ve výše uvedeném programu jsme deklarovali 3 řádky a 10 sloupců našeho pole řetězců. Ale kvůli předdefinování velikosti pole řetězců se spotřeba místa programu zvyšuje, pokud paměť není správně využita nebo je ponechána nevyužitá. Nyní se pokusíme uložit stejné řetězce do pole ukazatelů.

Příklad 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;> }>

>

>

Výstup

geek Geeks Geeksfor>

Zde je celková použitá paměť paměť potřebná pro uložení řetězců a ukazatelů, aniž by zůstalo prázdné místo, což šetří spoustu plýtvaného místa. Můžeme to pochopit pomocí obrázku níže.

paměť-reprezentace-pole-řetězců

Prostor obsazený polem ukazatelů na znaky je znázorněn plnými zelenými bloky s výjimkou paměti potřebné pro uložení ukazatele, zatímco prostor obsazený polem řetězců zahrnuje plné i světle zelené bloky.

Pole ukazatelů na různé typy

Nejen, že můžeme definovat pole ukazatelů pro základní datové typy jako int, char, float atd., ale můžeme je také definovat pro odvozené a uživatelem definované datové typy, jako jsou pole, struktury atd. Uvažujme níže uvedený příklad, kde vytvoříme pole ukazatelů ukazujících na funkci pro provádění různých operací.

Příklad:

restartujte mysql ubuntu

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;> }>

>

>

Výstup

Sum : 55 Difference : 45 Product : 250 Quotient : 10>

Aplikace Array of Pointers

Pole ukazatelů je užitečné v široké škále případů. Některé z těchto aplikací jsou uvedeny níže:

  • Nejčastěji se používá k ukládání více řetězců.
  • Používá se také k implementaci LinkedHashMap v C a také v technice Chaining řešení kolizí v hashování.
  • Používá se v třídicích algoritmech, jako je bucket sort.
  • Lze jej použít s jakýmkoli typem ukazatele, takže je užitečný, když máme oddělené deklarace více entit a chceme je uložit na jedno místo.

Nevýhody Array of Pointers

Pole ukazatelů má také svůj podíl na nevýhodách a mělo by se používat, když výhody převažují nad nevýhodami. Některé z nevýhod pole ukazatelů jsou:

    Vyšší spotřeba paměti: Pole ukazatelů vyžaduje více paměti ve srovnání s obyčejnými poli kvůli dodatečnému prostoru potřebnému k uložení ukazatelů. Složitost: Použití pole ukazatelů může být složité ve srovnání s jednoduchým polem. Náchylnost k chybám: Když používáme ukazatele, všechny chyby spojené s ukazateli přicházejí s ním, takže s nimi musíme zacházet opatrně.

Související článek: Ukazatel na pole | Pole ukazatel