Constante și pointeri
Pointeri către constante
Pointerii pot indica atât către variabile, cât și către constante. Pentru a defini un pointer către o constantă, acesta trebuie declarat și el cu cuvântul cheie const:
#include <iostream>
int main()
{
const int a {10};
const int *pa {&a};
std::cout << "address=" << pa << "\tvalue=" << *pa << std::endl;
}
Aici, pointerul pa indică spre constanta a. Prin urmare, chiar dacă dorim să modificăm valoarea de la acea adresă, nu putem face acest lucru:
*pa = 34; // eroare la compilare
Este posibil și ca un pointer către o constantă să indice, de fapt, spre o variabilă:
#include <iostream>
int main()
{
int a {10};
const int *pa {&a};
std::cout <<"value=" << *pa << std::endl; // value=10
a = 22;
std::cout <<"value=" << *pa << std::endl; // value=22
//*pa = 34; // nu este permis
}
În acest caz, variabila a poate fi modificată direct, dar nu prin intermediul pointerului pa.
Prin intermediul unui pointer către o constantă nu putem modifica valoarea, dar putem schimba adresa către care pointează:
const int a {10};
const int *pa {&a}; // pointerul pointează către constanta a
const int b {45};
pa = &b; // pointerul pointează acum către b
std::cout <<"*pa = " << *pa << std::endl; // *pa = 45
std::cout <<"a = " << a << std::endl; // a = 10 — constanta a nu se modifică
Pointer constant
Un pointer constant nu poate schimba adresa pe care o conține, dar poate modifica valoarea de la acea adresă:
#include <iostream>
int main()
{
int a {10};
int *const pa {&a};
std::cout << "value=" << *pa << std::endl; // value = 10
*pa = 22; // modificăm valoarea
std::cout << "value=" << *pa << std::endl; // value = 22
int b {45};
// pa = &b; // eroare — nu putem schimba adresa
}
Pointer constant către constantă
Combinarea celor două cazuri de mai sus — pointer constant către o constantă — nu permite modificarea nici a adresei stocate, nici a valorii de la acea adresă:
int main()
{
int a {10};
const int *const pa {&a};
//*pa = 22; // nu este permis
int b {45};
// pa = &b; // nu este permis
}