Programovanie (1) v C/C++
1-INF-127, ZS 2024/25
Prednáška 13
Skočit na navigaci
Skočit na vyhledávání
Smerníková aritmetika
Na smerníkoch možno vykonávať určité operácie, súhrn ktorých býva honosne nazývaný smerníkovou aritmetikou. Nech p, p1, p2 sú smerníky definované ako
T *p;
T *p1;
T *p2;
kde T označuje nejaký typ. Nech n je typu int. Potom:
- p + n označuje smerník na n-tý pamäťový úsek (postačujúci práve na uchovanie hodnoty typu T) za adresou p.
- Napríklad p+n je to isté ako &p[n] a *(p+n) je to isté ako p[n].
- p++ je skratkou pre p = p+1, ...
- Operátor [ ] je teda nadbytočný – p[n] je len skratkou pre často používaný výraz *(p+n).
- p - n označuje smerník na n-tý pamäťový úsek (postačujúci práve na uchovanie hodnoty typu T) pred adresou p.
- p1 - p2 je celé číslo k také, že p1 == p2 + k. Zmysluplný výsledok možno očakávať len vtedy, keď p1 a p2 sú adresami prvkov v tom istom poli (v jedinom súvislom kuse pamäte).
- Smerníky tiež možno prirodzene porovnávať relačnými operátormi ==, <, >, <=, >=, !=. Výsledok je zmysluplný opäť len vtedy, keď p1 a p2 sú adresami prvkov v tom istom poli.
Program, ktorý najprv načíta pole a následne prvky tohto poľa vypíše od konca, tak možno napísať napríklad aj takto:
#include <iostream>
using namespace std;
const int maxN = 1000;
int main(void) {
int a[maxN];
int N;
cout << "Zadaj pocet cisel: ";
cin >> N;
for (int i = 0; i <= N-1; i++) {
cout << "Zadaj cislo " << i + 1 << ": ";
cin >> *(a + i);
}
for (int i = N-1; i >= 0; i--) {
cout << *(a + i) << " ";
}
cout << endl;
return 0;
}
Ladenie programov so smerníkmi
- Smerníky môžu byť nepríjemným zdrojom chýb, keďže kompilátor nekontroluje, či sú používané správne.
- Napríklad možno čítať aj zapisovať mimo alokovanej pamäte.
- S odchytávaním takýchto chýb môžu pomôcť automatizované nástroje, ako napríklad Valgrind (pre Linux) alebo Dr. Memory (pre Windows aj Linux).
- Návod na prácu s programom valgrind