MODIFICATORUL const
Am văzut anterior că o constantă se defineşte prin caracterele care intră în compunerea ei. De asemenea, în acelaşi capitol s-a arătat că putem atribui un nume unei constante printr-o construcţie #define. Un astfel de nume se spune că este o constantă simbolică şi el se substituie prin şirul de caractere care şi corespunde, în faza de preprocesare.
Un alt mod de a defini o constantă este acela de a folosi modificatorul const într-o declaraţie. Printr-o astfel de declaraţie, unui nume i se poate atribui o valoare constantă. În acest caz, numele respectiv nu mai este tratat de preprocesor şi el poate fi folosit în program în mod analog cu numele variabilelor. Unui astfel de nume declarat cu ajutorul modificatorului const nu i se poate schimba valoarea printr-o expresie de atribuire, ca şi unei variabile obişnuite.
Formatele declaraţiei cu modificatorul const sunt următoarele:
tip const nume = valoare;
const tip nume = valoare;
tip const nume;
const tip nume;
const nume = valoare;
const nume;
Exemplu:
void main (void)
{ const i=10; // i devine egal cu 10; nu este posibila o atribuire i=0
const pi = 3.1415926
char *const s=”martie”; // s este un pointer constant spre zona in care este
// pastrat sirul de caractere “martie”. Valoarea lui s
// nu poate fi schimbata dar continutul zonei spre
// care pointeaza s poate fi schimbat
*s= ‘1’; // schimba litera m cu 1
*(s+1)=’2’ // schimba litera a cu 2
char const *s=”aprilie”; // s este un pointer spre o zona constanta.
// valoare lui s poate schimbata dar sirul “aprilie”
// nu poate fi modificat
const char *s=”aprilie” // este identica cu declaratia de mai sus.
}
Modificatorul const se foloseşte frecvent la declararea parametrilor formali de tip pointer. O astfel de declaraţie are formatul:
const tip *nume_parametru_formal;
Un parametru formal declarat prin construcţia :
tip *nume_parametru_formal;
corespunde unui parametru efectiv a cărui valoare este o adresă. La apel, valoarea parametrului formal devine egală cu această adresă. Datorită acestui fapt, funcţia apelată poate să modifice data aflată la adresa respectivă. Dacă se foloseşte modificatorul const utilizat la declararea unui astfel de parametru formal atunci se interzice funcţiei apelate să modifice data de la adresa recepţionată la apel de către parametrul formal corespunzător. Acest mecanism este folosit frecvent în cazul funcţiilor de tratare a şirurilor de caractere.
De exemplu funcţia strlen din biblioteca standard a limbajului C are prototipul:
unsigned strlen (const char *s);
Ea se apelează prin expresii de atribuire de forma:
i=strlen(x);
unde x este un pointer spre o zonă de memorie în care se află un şir de caractere.
Funcţia strlen determină lungimea şirului aflat la adresa recepţionată de către parametrul s. Ea nu are voie să modifice şirul respectiv şi din această cauză parametrul s se declară folosind modificatorul const.