Programul si datele sale sunt pastrate in memoria RAM ( Random Access Memory ) a calculatorului.
Definitie:
Un pointereste
o variabila care pastreaza adresa unei date, nu valoarea datei.
Un pointer poate fi utilizat pentru referirea diferitelor date si structuri de date. Schimband adresa memorata in pointer, pot fi manipulate informatii situate la diferite locatii de memorie.
Pointerii permit de asemenea crearea de noi variabile in timpul executiei programului, prin alocare dinamica.
Declaratia
unei
variabile pointer:
tip_referit
* var_pointer; //* este operator de indirectare
Initializarea
cu
adresa unei variabile:
tip_referit var,* var_pointer;
var_pointer=&var;
Valoarea
de
la adresa indicata de pointer:
*var_pointer // este de tip_referit
Spatiul
ocupat
de o variabila pointer:
sizeof(var_pointer) //
valoarea expresiei este 2 (
in modelul small ),
oricare ar fi
// tip_referit
//
expresile de mai jos conduc la aceeasi valoare, 2
sizeof(&var)
sizeof(tip_referit *)
Tiparirea
valorii
unui pointer:
se foloseste prototipul %p, valoarea aparand sub forma a patru cifre hexa
Adresa
unei
variabile pointer este un pointer, la fel ca adresa unei variabile de orice
alt tip:
&var_pointer
Observatie:
Un pointer poate fi utilizat doar dupa initializare: prin atribuirea adresei unei variabile ( statice ) sau prin alocare dinamica.
Exemplu:
Programul urmator declara un pointer la intregi,
utilizand variabila in toate situatiile prezentate mai sus:
| #include <stdio.h>
#include <conio.h> int i,*pi;
void main(void){
i=3; pi=&i; // variabila pi se
initializeaza cu adresa var i
f=-5;
/* sizeof aplicat unor expresii de
tip pointer */
pi=&f; /* adresa lui f e convertita
implicit la pointer la intreg*/
|
Functiile
de
gestionare a memoriei au prototipurile in fisierele header alloc.h
si
stdlib.h:
void * malloc(size_t size);
Functia malloc returneaza un pointer la blocul alocat pe heap de dimensiune size, daca un astfel de bloc exista, altfel returneaza NULL.
void free(void * block);
Functia free elibereaza blocul alocat anterior cu malloc, avand pointerul transmis ca parametru.
Exemplu:
Programul urmator aloca spatiu pentru o variabila
intreaga dinamica, dupa citire si tiparire, spatiul fiind eliberat
| #include <stdio.h>
#include <alloc.h> #include <conio.h> int *pi; // pi este variabila statica void main(void){
pi=(int *)malloc(sizeof(int));
printf("valoare:");
*pi*=2; // dublarea valorii printf("val=%d,pi(adresa pe heap)=%p,adr_pi(var
statica)=%p\n",
/* sizeof aplicat unor expresii
*/
free(pi); //eliberare spatiu printf("pi(dupa elib):%p\n",pi); // nemodificat, dar invalid getche();
|
Numele unui tablou este un pointer
constant spre primul sau element. Expresiile
de mai jos sunt deci echivalente:
nume_tablou
&nume_tablou &nume_tablou[0]
*nume_tablou nume_tablou[0]
Exemplu:
Programul de mai jos citeste si afiseaza elementele
a doua tablouri, la primul accesul se face indexat, la al doilea prin pointeri.
| #include <stdio.h>
#include <conio.h> #define N 5 int tab1[N],tab2[N]; void citire1(void){ /* citeste elementele
lui tab1 prin accesarea indexata
void tiparire1(void){ /* tipareste elementele
lui tab1 prin accesarea indexata
citire1();
citire2();
getche();
|
Daca:
tip_referit
* var_pointer;
int i;
expresia:
var_pointer+i
este un pointer avand valoarea mai mare decatvar_pointer cusizeof(tip_referit)*n
Exemplu:
| #define N 10
float *p,t[N]; int i; void main(void){
//citirea valorii lui t[2]
|