Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Pointeri
Pointerii sunt variabile care contin adresa de memorie a unei alte variabile. Din aceste considerente,
pointerii se numesc si variabile de adresa.
Presupunem ca avem o variabila de tip intreg numita entitate localizata la adresa de memorie 0x1000
(adresele sunt automat asigante variabilelor de catre compilator). Daca dorim sa referim aceasta
variabila prin intermediul unui pointer entitate_ptr, atunci valoarea pointerului va fi 0x1000
(entitate_ptr = 0x1000), astfel spunem ca entitate_ptr 'arata' spre variabila entitate. (Pentru a se evita
confuziile, se recomanda ca numele pointerilor sa aiba sufixul _ptr).
Pointerii se declara punand un asterisc (*) in fata numelui variabilei:
int variabila; /*definire variabila intreg*/
int *variabila_ptr; /*definire pointer la un intreg */
Operatorii specifici pointerilor sunt: operatorul de dereferentiere * (pentru un pointer, returneaza entitatea
referita de pointer) si operatorul de adresa & (pentru o entitate, returneaza adresa entitatii).
Variabila pointer obiect_ptr primeste adresa variabilei obiect, astfel obiect_ptr va indica spre zona de memorie unde este memorata variabila obiect. In ultima linie, se stocheaza valoarea 5 la zona de memorie spre care arata obiect_ptr, adica in variabila obiect.
Folosirea gresita a operatorilor poate duce la functionari incorecte a programului sau, in cazul fericit, la erori semnalate de compilator .
Mai multi pointeri pot indica spre aceeasi zona de memorie:
int obiect;
int *obiect_ptr1;
int *obiect_ptr2;
obiect = 1; /* se atribuie valoarea 1 lui obiect */
obiect_ptr1 = &obiect;
obiect_ptr2 = obiect_ptr1;
Un pointer special definit in limbajul C este pointerul NULL, care nu indica spre nimic (adresa spre care arata acest pointer este 0). Acest pointer este definit in stdio.h si in stdlib.h ca fiind (void *) 0, adica un pointer spre o locatie de tip void si care arata spre locatia de memorie 0.
In C, exista o stransa legatura intre pointeri si tablouri. Cand se foloseste numele unui tablou (fara
index), se genereaza un pointer catre primul element al tabloului. Astfel, in C se pot transmite tablouri
ca parametri in functii (de fapt, se transmite adresa de inceput a tabloului). Alt avantaj al tratarii
unitare pointer-tablou este aplicarea aritmeticii pointerilor pentru accesarea elementelor unui tablou.
Identitate pointer-tablou se reflecta cel mai bine in operatiile cu siruri de caractere, unde sirul de
caractere este un tablou de caractere sau un pointer la caracter.
Limbajul C permite nu doar referirea unor date, ci si referirea functiilor (pointeri la functii). Aceasta
nu difera mult de referirea datelor, un pointer la o functie retinand adresa de memorie unde incepe
rutina care implementeaza functia.
Un pointer la o functie se declara in maniera:
tip_returnat (*nume_pointer)( declaratii parametri );
Astfel, daca avem implementata o functie f1 si un pointer spre functie f1_ptr, secventa urmatoare va
arata cum se poate realiza prin intermediul unui pointer apelul unei functii:
#include <stdio.h>
void f1(int a)
void main(void)
La fel ca in cazul tablourilor, putem atribui direct unui pointer adresa functiei, fara a folosi operatorul
& (f1_ptr=f1; este identic cu f1_ptr=&f1;).
In C, deoarece limbajul ofera o mare libertate de exprimare, este foarte usor pentru un programator
neatent sa faca erori care nu sunt semnalate la compilare, dar care duc la comportari neasteptate ale
programului.
O eroare tipica este atribuirea de valori pointerilor neinitializati:
int *un_pointer;
*un_pointer=5;
In aceasta situatie, deoarece un_pointer este neinitializat, valoarea 5 este scrisa in memorie la o locatie
aleatoare, poate chiar rezervata altei variabile. In cazul in care un pointer nu arata spre o zona de memorie rezervata, trebuie alocata o zona de memorie in mod explicit, folosind functia malloc:
un_pointer=(int *)malloc(sizeof(int));
Functia malloc rezerva spatiu de memorie si returneaza adresa spatiului rezervat; zona de memorie
referita de un pointer poate fi eliberata folosind functia free. Ambele functii sunt definite in stdlib.h.
O alta greseala des intalnita este referirea pointerilor spre alte locatii de memorie:
int obiect=5;
int *obiect_ptr;
obiect_ptr = obiect;
Lipsa operatorului de adresa & face ca obiect_ptr sa indice spre locatia de memorie aflata la adresa 5.
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate