Tipul char*

Pointeri la un caracter

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;
}

Morar Filip, clasa a XII-a A, Colegiul Național ”Ștefan cel Mare”, Suceava, Proiect pentru Examenul de Atestat Profesional, 2017
Creat cu Webnode
Creați un site gratuit! Acest site a fost realizat cu Webnode. Creați-vă propriul site gratuit chiar azi! Începeți