Tipul char*
Pointeri la un caracter
Tipul pointer - generalităţi
- 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;
}