Programovanie v jazyku C++

Dátové typy


Smerníky

Programovací jazyk C++ pozná špeciálny typ premennej určný pre manipuláciu s adresami. Nazýva sa smerník a je označený unárnym operátorom *. Nezabúdajte, že význam operátorov závisí od kontextu, unárny operátor * nemá nič spoločné s binárnym operátorom * pre násobenie. Smerníky umožňujú voľbu a manipuláciu s adresami premenných a funkcií počas chodu programu. Použitie smerníkov je hlavne v oblasti manipulácie s poľami, argumentami funkcií, pri priamom prístupe do pamäte a dynamických konštrukciách. Príklad syntaxe smerníkov:
  int *pi;               // smernik na int
  char** cpp;            // smernik na smernik na char
  int (*vp)[10];         // smernik na vektor zlozeny z 10 int
  int (*fp)(char, char*);// smernik na funkciu, ktora ma argumenty (char, char*)
                         // a vracia int
Základnou operáciou nad smerníkmi je dereferencovanie, to znamená oslovenie objektu, na ktorý ukazuje smerník. V nasledujúcom príklade je použitý operátor &, prostredníctvom ktorého vieme získať adresu objektu, na ktorý sme operátor uplatnili.

exam0400.cpp

#include <iostream.hpp>

void main()
{
  int i=0x1234;        // deklaracia a definicia premennej i
  int *pi;             // deklaracia a definicia smernika na int, smernik
                       // ukazuje nevedno kam
  pi=&i;               // inicializacia smernika adresou premennej i
  *pi=0x4321;          // dereferencia - spristupnenie a pouzitie hodnoty premennej i

  cout<<"Hodnota i  = "<<hex<<i<<endl;
  cout<<"Adresa &i  = "<<(&i)<<endl;
  cout<<"Hodota pi  = "<<(pi)<<endl;
  cout<<"Adresa &pi = "<<(&pi)<<endl;
}
 Situáciu znázorňuje obrázok, Vo vašom prípade budú hodnoty adries zrejme odlišné.

Smerníkmi v C++ sú aj mená polí a mená funkcií. Ak vytvoríme a inicializujeme pole 10 hodnôt int, napríklad:

  int  array[10] = {9,8,7,6,5,4,3,2,1,0};
potom je array smerníkom na prvý prvok poľa. Na rozdiel od predchádzajúceho príkladu je tento smerník konštantný, nie je možné tomuto smerníku priradiť inú hodnotu, ale je možné manipulovať s hodnotou tohoto smerníka.
  int i;
  i = array[0];  // spristupnenie prveho prvku pola operatorom []
  i =*array;     // to iste dereferenciou smernika
  i =*(array+5); // spristupnenie piateho prvku pola
  i =*array+5;   // spristupnenie hodnoty prveho prvku pola zvysenej o 5
Pretože operátor [] spočítava jednoducho adresu poľa s argumentom operátora, je možná aj takáto, z matematického pohľadu nezmyselná, ale formálne správna konštrukcia
  i =5[array];   // spristupnenie piateho prvku pola
Textové reťazce sú špecialnou formou znakových polí, od obyčajného poľa sa odlišujú len tým, že majú ukončovací znak - nulu. Veľkosť poľa, ktoré obsahuje textový reťazec je v skutočnosti o jednu väčšie, ako je počet znakov v reťazci. S textovými reťazcami pracujeme tak isto ako s inými poliami.
  char *text = "Tento textovy retazec je v skutocnosti pole charakterov";
  char c = *text;
  char q = text[0];