Tipul char*

Tipul pointer – generalităţi

Având definit un tip de dată, se poate defini un nou tip de dată care va reţine adrese ale variabilelor din tipul dat.

Exemplul 1: Având definit tipul int, se poate defini un nou tip care va reţine adrese ale variabilelor de tip int. Noul tip definit se va numi int *. În acest caz spunem că:

    • Tipul int * se numeşte tip pointer la int;

    • O variabilă de tip int * este de tip pointer la int şi va putea memora adrese ale variabilelor de tip int;

    • Tipul int se numeşte tip asociat tipului pointer int;

Declarare : forma generală:

tip_asociat * variabilă_pointer;

Exemplu: int * p; //pastreaza adresa unui intreg

Legarea unui pointer la o variabilă (obţinerea adresei unei variabile)

Forma generală :

tip_asociat * variabilă_pointer;

tip_asociat variabila_tip_asociat;

variabila_pointer = & variabila_tip_asociat;

Exemplu:

int * p; //pointer catre un intreg-contine adresa unui intreg

int x = 2; //variabila x este variabila statica de tip int cu valoarea 2

p = &x; //p primeste ca valoare adresa variabilei x prin intermediul operatorului &

cout<<"adresa variabilei x este p="<<p<<endl;

Exemplu:

    • valoarea variabilei x este 2

    • adresa variabilei x este 0x24ff08

    • valoarea variabilei p va fi 0x24ff08,

    • adresa variabilei este 0x24fefc

    • valoarea poinetrului *p este 2(valoarea pastrata la adrsa 0x24ff08)

Vizualizare in figura urmatoare.

Dereferenţierea (adresarea indirectă)

Adresarea indirecta are urmatoarea forma generala:

* variabilă_pointer = expresie_tip_asociat;

Exemplu:

int x, *p;

int main ()

{ x = 2 ; //variabila x primeste valoarea 2

p = & x ; //variabila p primeste valoarea adresei lui x

*p = 4; //valoarea indicata de pointerul p(valoarea de la adresa lui x) ia

//valoarea 4.Se modifica continutul variabilei x prin intermediul

// pointerului *p

cout << x; //afiseaza valoarea 4

return 0;

}

Atribuirea între doi pointeri de acelaşi tip

Atribuirea între doi pointeri de același tip se realizează respectând următoarea formă generală:

tip_asociat * v1, v2;

v1 = v2;

Exemplu:

int main ()

{

int x = 2, *p, *q ;

// definim o variabila intreaga x cu valoarea 2 si doi pointeri catre int notati *p si *q

p = & x ; // variabila p primeste ca valoarea adresa variabilei x

q = p; // variabila q primeste valoarea variabilei p

cout<<*q; //afisaza 2, valoarea memorata la adresa x, adresa pastrata in p si q

return 0;

}

Observaţie:

În instrucţiunea p = &x; variabilei de tip pointer p i se atribuie o valoare constantă de tip pointer. (adresa variabilei x, această adresă nu poate fi modificată). Astfel o instrucţiune de forma &x = p; este greşită (se atribuie unei constante o variabilă). În instrucţiunea p = q; variabilei de tip pointer p i se atribuie o variabilă de tip pointer. Astfel o instrucţiune de forma q = p; este corectă.

Pointer la caracter (char *)

Aşa cum putem declara variabile de tipul int*, la fel se pot defini variabile de tip char*. În acest caz, o variabilă de tip char* (pointer la caracter) va memora o adresă a unei variabile de tip char.

La fel ca pentru orice tip de dată, pentru tipul char * există variabile şi constante. Caracterele care formează un vector de caractere se vor memora la adrese de memorie succesive. Numele unui vector de caractere S reprezintă adresa de început a şirului, adică adresa caracterului S[0]. Spaţiul de memorare pentru un vector de caractere se alocă în momentul declarării vectorului. Locul memorării (alocării) nu poate fi modificat. Din acest motiv, numele unui vector de caractere este o constantă de tip char*.

Exemplu:

int main()

{

char S[200]="ABCDEF"; //sirul "ABCDEF" este memorat in S

char * p; //pointer la caracter

p=S; //p primeste adresa de inceput a sirului S: ABCDEF

cout << p<<endl; //afiseaza sirul care incepe la adresa p:ABCDEF

p++; //adresa caracterului 'B'

cout << p<<endl; //afiseaza sirul care incepe la adresa p:BCDEF

*p = 'Z'; //schimba caracterul 'B' cu 'Z'

cout << p<<endl; //afiseaza sirul care incepe la adresa p:ZCDEF

//S = p; atribuire gresita!

p = S + 3; //adresa p creste cu 3, salt cu 3 octeti:

cout << p<<endl; //afiseaza sirul care incepe la adresa p:DEF

cout << S<<endl; //p primeste adresa de inceput a sirului S: AZCDEF

return 0;

}