MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

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
}