Linux E X P R E S

Facebook

Programovanie v jazyku C++: Pointery – Pointerová aritmetika (3)

cplusplus.png

Naučte sa vytvoriť odkaz (pointer) na vaše vytvorené pole. Zoznámte sa s problematikou pointerovej aritmetiky a jej fungovania.


Deklarujeme pole ako pointer

Ako definujeme pole ako pointer? Deklarácia je podobná ako napr. pri numerickej premennej. Vytvorme pointer, ktorý bude odkazovať na pole. I keď formulácia „odkazovať na pole“ nie je úplne správna, pretože ukazovateľ neukazuje na nejakú adresu poľa, ale na prvý prvok poľa. Adresa poľa ako taká neexistuje. Pole je zložené z prvkov, pričom každý prvok má svoju adresu v pamätí.

#include <iostream>
using namespace std;

int main()
{
    int pole[] = {13,17,25,89,33};
    int *pointerPole = pole;
    return 0;
}

Super, program nám zbehol bez problémov. Zdá sa, že sme pole ako pointer deklarovali správne. Skúsme pole vypísať. Čo myslíte, že nám program vypíše?

#include <iostream>
using namespace std;

int main()
{
    int pole[] = {13,17,25,89,33};
    int *pointerPole = pole;
    cout << *pointerPole;
    return 0;
}

Ak ste tipovali správne, že program vypíše len prvý prvok, tak princípu už pomerne dobre chápete. Teraz sa presvedčme, že sme pointeru priradili adresu prvého prvku poľa.

#include <iostream>
using namespace std;

int main()
{
    int pole[] = {13,17,25,89,33};
    int *pointerPole = pole;
    cout<<"Adresa pointeru: "<< pointerPole;
    cout<<"\nAdresa povodneho pola: "<<pole;
    return 0;
}

Výsledok programu:

Adresa pointeru: 0x6dfee8
Adresa povodneho pola: 0x6dfee8

Vidíme, že adresa je rovnaká. 

Pointerová aritmetika

Keď už pomerne dobré chápeme problematiky adries v spojení s poľami, ukážeme si efektívnu prácu na základe toho, čo sme sa práve dozvedeli. Totiž, ak pole je množina za sebou idúcich buniek pamäte, vieme sa na základe pointerovej aritmetiky rýchlo dostať do ľubovoľného prvku poľa.

Skúsme použiť pointerovú aritmetiku a zároveň vypísať adresy jednorozmerného poľa. Ak by vás zmiatlo pomenovanie „jednorozmerný“, nie je to nič iné než pole, s ktorým sme doteraz pracujeme. Toto pole má jeden rozmer, dĺžku. To len aby sme mali jasno v pojmoch.

#include <iostream>
using namespace std;

int main()
{
    int pole[] = {13,17,25,89,33};
    int *pointerPole = pole;
    int *pomocnePointerPole = pointerPole;
    int velkostPola = sizeof(pole) / sizeof(int);
    cout << "Vypisanie hodnot a adries pola: \n";
    while(pointerPole < pomocnePointerPole + velkostPola)
    {
        cout << *pointerPole << " a adresa bunky pamate: " << pointerPole << "\n";
        pointerPole++;
    }
    cout << "\n";
    return 0;
}

Výsledok programu:

Vypisanie hodnot a adries pola:
13 a adresa bunky pamate: 0x6dfee0
17 a adresa bunky pamate: 0x6dfee4
25 a adresa bunky pamate: 0x6dfee8
89 a adresa bunky pamate: 0x6dfeec
33 a adresa bunky pamate: 0x6dfef0

Všimnite si, že jednotlivé adresy prvkov sú od seba vzdialené 4 bajty, čiže o veľkosť celého čísla. Ak napíšeme pointerPole++;, dôjde k sčítaniu adresy s jedným celým číslom, presne takto: pointerPole + 1. Ak napíšeme pointerPole + 2, tak sa adresa sčíta o dve celé čísla. Vyskúšajme si ako to funguje v ďalšom príklade.

#include <iostream>
using namespace std;

int main()
{
    int pole[] = {13,17,25,89,33};
    int *pointerPole = pole;
    pointerPole = pointerPole+2;
    cout << "Treti prvok: " << *pointerPole << "\n";
    pointerPole = pointerPole-1;
    cout << "Druhy prvok: " << *pointerPole << "\n";
    return 0;
}

Výsledok programu:

Treti prvok: 25
Druhy prvok: 17

V tomto príklade sme skúsili i znížiť adresu a to konkrétne takto: pointerPole-1;. Všimnite si trochu mätúce priraďovanie napr. pointerPole = pointerPole+2;. Musíte si uvedomiť, že najprv sa vyhodnotí to čo je vpravo od = a až tak sa priradí výsledok do tej istej premennej, čiže k žiadnej kolízii nedôjde.

V ďalšom článku si ukážeme najčastejšiu chybu spojená so syntaxou pointerov a funkcie vracajúce pointery.

Námet na tento článok poslúžili tieto zdroje:

Pointers, cplusplus.com, dostupné online

6.8a — Pointer arithmetic and array indexing, learncpp.com, dostupné online

Diskuze (0) Nahoru