Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Pointeri - Expresii cu pointeri in C

c



+ Font mai mare | - Font mai mic



Pointeri

Un pointer este o variabila care poate contine o adresa de memorie. Aceasta adresa este localizarea in memorie a unui alt obiect (de regula o alta variabila). De exemplu, daca o variabila contine adresa alteia, despre prima se spune ca este un pointer la cea de-a doua. O variabila de tip pointer se declara in C astfel:



<Tip> * <Nume>;

unde <Tip> este tipul de baza al pointerului iar <Nume> este numele variabilei pointer. Tipul de baza al pointerului defineste tipul de variabila catre care indica pointerul. Practic, orice tip de pointer poate sa indice orice in memorie. Problema este, insa, ca aritmetica pointerilor este integral raportata la tipul de baza al pointerului.

Operatori pentru pointeri

Exista doi operatori speciali pentru pointeri: * si &. & este un operator unar care returneaza adresa din memorie a operandului sau. Operatorul * returneaza valoarea inregistrata la adresa care il urmeaza. Evident ca operatorul & se aplica oricarui tip de variabila dar operatorul * cere dupa el, neaparat, o variabila pointer.

Expresii cu pointeri

In general, expresiile care implica pointeri se conformeaza acelorasi reguli ca si celelalte expresii. Exista, totusi, o serie de particularitati pe care le vom evidentia in acest paragraf in ceea ce priveste aritmetica pointerilor.

Astfel:

Atribuirile sunt permise intre pointeri concordanti ca tip.

Pointerilor li se poate aplica operatorul ++ (incrementare) ca mai jos

int *p;

int mat[10];

p=&mat[0];

p++; // Operatorul de incrementare aplicat pointerului p

p- -

In urma aplicarii operatorului de incrementare pointerului p, care continea adresa primului element al tabloului unidimensional mat, offset-ul acestuia este incrementat cu 2, adica atat cat este lungimea in octeti a tipului de baza al pointerului p.

Pointerilor li se poate aplica operatorul - - (decrementare) .

In urma aplicarii operatorului de decrementare pointerului p, care continea adresa celui de-al doilea element al tabloului unidimensional mat, offset-ul acestuia este decrementat cu 2, adica atat cat este lungimea in octeti a tipului de baza al pointerului p.

De asemenea, putem aduna sau scadea intregi la, sau din pointeri. De exemplu:

p=p+10;

face ca p sa indice al 10-lea element de acelasi tip cu tipul de baza al lui p, relativ la elementul curent. In exemplul de mai jos ilustram utilitatea aritmeticii pointerilor in contextul lucrului cu matrice.

#include<stdio.h>

#include<conio.h>

int matr[10][10]; //matrice de intregi bidimensionala

int *p; // pointer la intregi

int dimm;

void main

p=&matr[0][0]; //p refera primul element al matricei

for (i=0;i<dimm;i++)

cprintf('rn Ref_poin=%d',*(p+i)); //modificare offset p in expresie

getch();



p=&matr[0][0];

for (i=0;i<dimm;i++)

getch();

p=&matr[0][0];

for (i=0;i<dimm;i++)

getch();

Pointerii pot fi comparati in cadrul expresiilor relationale. Dati pointerii p si q, este perfect valabila instructiunea:

if (p<q) cprintf ("p indica o memorie de adresa mai mica decat qn");

Evident, in C se poate vorbi de matrice de pointeri, de indirectare multipla si, evident, de alocarea dinamica a memoriei aferente unor pointeri.

Functii de alocare dinamica in C

Pointerii ofera suportul necesar pentru sistemul puternic de alocare dinamica a memoriei in C. Alocarea dinamica este caracteristica prin care un program poate obtine memorie in timpul executiei. Dupa cum se stie, variabilelor globale li se aloca memorie in timpul compilarii. Variabilele locale folosesc memoria de tip stiva. In mod cert, nici variabilele globale nici cele locale nu pot fi adaugate in timpul executiei programului. Exista situatii in care necesarul real de memorie este cunoscut de-abia in timpul executiei programului.

A Chiar daca C++ accepta pe deplin sistemul de alocare dinamica al lui C, el isi defineste propriul sistem, care contine mai multe imbunatatiri fata de cele din C.

Memoria alocata de functiile de alocare dinamica din C este obtinuta din HEAP- zona de memorie libera situata intre zona permanenta a memoriei programului si stiva.

Nucleul sistemului de alocare din C consta din functiile malloc() si free().

Aceste "instrumente" de alocare lucreaza in pereche, folosind zona de memorie libera pentru a stabili si a pastra o lista cu memoria disponibila.

Functia malloc() aloca memorie, avand urmatorul prototip:

void *malloc(size_t numar_de_octeti);

In acest prototip, numar_de_octeti este numarul de octeti din memorie pe care dorim sa-l alocam programului. Functia malloc() returneaza un pointer de tipul void, ceea ce inseamna ca il puteti atribui oricarui tip de pointer.

Prototipul functiei free este:

void free(void *p);

Functia free returneaza in sistem memoria alocata anterior pointerului p. Este esential sa nu se apeleze free cu un argument impropriu; deoarece acest fapt poate aduce prejudicii gestiunii de catre sistem a memoriei libere. Exemplul de mai jos arata modul efectiv de utilizare a functiilor malloc si free, precum si modul de utilizare a functiei memcpy, in situatia in care se doreste copierea continutului memoriei de la o anumita adresa la alta adresa. De remarcat, totodata, faptul ca bibliotecile C au numeroase alte functii pentru a satisface cerintele de alocare/ manipulare dinamica a memoriei in programele utilizator.

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<string.h>

void main

Programatorul Pascal recunoaste in suportul oferit de malloc() si free() solutia pentru problema alocarii de memorie la nivel de octet, ceea ce inseamna responsabilitatea programatorului de a realiza conversiile necesare in procesul de utilizare a memoriei astfel alocate, ca in programul de mai sus. C++ are propria oferta pentru alocarea dinamica de memorie din perspectiva structurata.





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 899
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved