Ukazatele na pole
C++ 11

image_printTisk

V tomto článku si probereme ukazatele na pole. Seznámíme se nejen s ukazateli na pole jednorozměrné, ale i na složitější případ, tedy pole vícerozměrná. Vše si zase samozřejmě uvedeme na názorných příkladech.

Začněme ukazateli na pole jednorozměrná. Deklarace tohoto typu ukazatele je v podstatě jednoduchá. Je jím obyčejný ukazatel na stejný datový typ jako má pole. Viz následující příklad.

int array[20];
int* ukazatel = array;

Na příkladu je uvedena deklarace pole jménem array a odkaz na začátek tohoto pole je přiřazen do proměnné ukazatel. Na příkladu je vidět, že pole je typu int a datový typ proměnné ukazatel musí tedy být “int*”.

Nyní se čtenáři ale může nabízet otázka, jak je možné přiřadit do ukazatele adresu na pole bez operátoru “&”. Jen pro připomenutí, tento operátor slouží k získání adresy na nějakou proměnnou. Pro vysvětlení se musíme zamyslet, co vlastně znamená uvedení samostatného identifikátoru pole v programovém kódu. Jeho význam překladač interpretuje právě jako konstantní ukazatel na začátek pole. V tomto smyslu je přiřazení mezi proměnnými arrayukazatel jen přesunem adresy mezi dvěma ukazateli. Ukažme si pro názornost následující příklad.

#include <iostream>
using namespace std;

int main() {
    int array[10];
    array[0] = 5;
    int* pointer;
    
    pointer = array;
    cout << "Adresa počáteku pole je " << hex << pointer << endl;
    cout << "Hodnota na prvního indexu je " << dec << *pointer << endl;
    cout << endl;
    
    pointer = &array[0];
    cout << "Adresa počáteku pole je " << hex << pointer << endl;
    cout << "Hodnota na prvního indexu je " << dec << *pointer << endl;
    
    return 0;
}
Unable to connect to the JDoodle service.

Příklad v podstatě demonstruje, že získání počátku adresy pole lze provést buď přes identifikátor, nebo získáním adresy první položky. Sémanticky je to ekvivalentní.

Bylo již zmíněno, že samostatný identifikátor pole se stává konstantním ukazatelem na jeho počátek. To se samozřejmě promítá i do operací, které jsou na takovýto identifikátor povolené. V podstatě lze říci, že jsou povoleny všechny operace s výjimkou těch, které by prováděli modifikaci adresy v tomto identifikátoru. Pojďme se podívat na další příklad.

int array[20];

// V pořádku, jde o čtení hodnoty na indexu 5 zápis na index 2.
// Není zde snaha modifikovat adresu v proměnné array.
int value = *(array + 5);
*(array + 2) = 10;

// Tyto zápisy vyjíjí snahu o modifikaci adresy a překladač je ohlásí s chybou
array++;
array += 10;


První dva řádky provádí jen čtení a zápis hodnoty do pole bez modifikace ukazatele vyjádřeného pomocí proměnné array, ale dva řádky poslední se o tuto modifikací snaží, a to není v C++ dovoleno.

 

  1. Vícerozměrná
    1. int (*)[some constant width][some-constant-width]
    2. rozdíl  mezi 2D array a dynamic array
      1. 2D array, souvíslá paměť od dynamických polí, více v další kapitole, které nejsou souvislou pamětí
    3. ukázka pointer arithmetic a indexace ukazatele

 

 

 

 

image_printTisk
Ukazatele na pole
C++ 11
Ohodnoťte tento článek

Související články

  • Metody vracení hodnot z funkce DO POKROČILÝCH ASI Tento článek pojednává o způsobech vracení hodnot z funkcí. Jsou to stejné způsoby, o kterých je psáno ve článku předchozím, tedy vracení hodnotou nebo vracení […]
  • Předávání a vracení polí z funkcí DO POKROČILÝCH TÉMAT Tento článek pojednává o práci s poli a funkcemi. Popisuje rozličné metody, jak předat pole jako argument funkci a také jak pole z funkce vrátit. Existují v […]
  • Aritmetika ukazatelů a pole V tomto článku si vysvětlíme, co je aritmetika ukazatelů. Ukážeme si význam a aplikaci dalších operátorů vztahujících se k ukazatelům a popíšeme si jejich vzájemné vztahy k polím různých […]
  • Pole v C++ V tomto článku si vysvětlíme nový pojem jazyka C++, a to pole nějakých hodnot. Je to jazykový konstrukt, který slouží k uchování seznamu hodnot nějakého datového typu. Je důležité zmínit, […]
  • Komentáře Tento článek pojednává o způsobu zápisu komentářů ve zdrojových kódech jazyka C++. Budou popsány oba druhy komentářů, tedy jednořádkové i jejich víceřádková varianta. Použití […]
  • Vícerozměrná pole Tento článek pojednává o vícerozměrných polích v jazyce C++. Seznámíme se s jejich významem, deklarací, inicializací a způsobem zápisu a čtení jejich hodnot. Na závěr článku bude zmíněno, […]