Welcome to Scribd. Sign in or start your free trial to enjoy unlimited e-books, audiobooks & documents.Find out more
Download
Standard view
Full view
of .
Look up keyword
Like this
3Activity
0 of .
Results for:
No results containing your search query
P. 1
Pointer - limbajul C

Pointer - limbajul C

Ratings: (0)|Views: 166|Likes:
Published by Andrei Luca
In document se contine material in care este explicat lucrul cu pointeri si aritmetica lor
In document se contine material in care este explicat lucrul cu pointeri si aritmetica lor

More info:

Published by: Andrei Luca on Feb 18, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/11/2013

pdf

text

original

 
Curs 7 Pointeri1
Pointeri
Pointerii sunt tipuri speciale variabile sau constante care au ca valori adrese ale unor altevariabile sau constante, adic
ă
adrese ale unor loca
ţ
ii de memorie. Ei permit calcule cu adrese,calcule care sunt specifice limbajelor de asamblare
ş
i sunt folosi
ţ
i în scopul scrierii unor programemai eficiente atât din punctul de vedere al timpului de execu
ţ
ie cât
ş
i din punctul de vedere alutiliz
ă
rii resurselor hard, în mod concret al utiliz
ă
rii memoriei computerelor.Pointerii sunt în mod special utili la alocarea dinamic
ă
a memoriei [Beu99]
ş
i la apelul prinreferin
ţă
.Pentru a în
ţ
elege mai u
ş
or pointerii este convenabil ca ace
ş
tia s
ă
fie discuta
ţ
i princompara
ţ
ie cu variabilele normale.O variabil
ă
"normal
ă
" este o loca
ţ
ie de memorie care p
ă
streaz
ă
o anumit
ă
valoare. Am v
ă
zut încapitolele precedente c
ă
la declararea unei variabile, acesteia i se aloc
ă
un anumit num
ă
r de octe
ţ
i,iar referirea la valoarea stocat
ă
în acei octe
ţ
i se face prin numele respectivei variabile. La nivelma
ş
in
ă
, respectiva loca
ţ
ie are o adres
ă
de memorie. Dac
ă
de exemplu, variabila declarat
ă
este
detip float, cei 4 octe
ţ
i care încep la adresa loca
ţ
iei respective sunt cunoscu
ţ
i programatorului ca
ş
i
 
ş
i pe ace
ş
ti 4 octe
ţ
i pot fi stocate valori reale în simpl
ă
precizie.Pointerii nu p
ă
streaz
ă
o valoare în sens tradi
ţ
ional ci adresa începutului loca
ţ
iei în care estestocat
ă
o anumit
ă
valoare. Deoarece pointerii p
ă
streaz
ă
adrese
ş
i nu valori "tradi
ţ
ionale", ei pot fiv
ă
zu
ţ
i ca un
pachet compus din dou
ă
p
ă
r
ţ
i
: pointerul însu
ş
i, care are ca valoare adresaprimului octet al loca
ţ
iei de memorie în care este stocat
ă
o variabil
ă
(sau constant
ă
)
ş
i tipul valoriistocate în loca
ţ
ia de memorie la începutul c
ă
reia pointeaz
ă
. Acest tip spune computerului cât
ă
 memorie s
ă
citeasc
ă
dup
ă
adresa la care pointeaz
ă
 
ş
i cum s
ă
o interpreteze.Limbajul C folose
ş
te pointerii în trei moduri:a) pentru a crea structuri dinamice de date construite din blocuri de memorieb) pentru a opera cu parametrii pasa
ţ
i func
ţ
iilor la apelul acestorac) pentru a accesa informa
ţ
ia stocat
ă
în tablouri.In C, exist
ă
o leg
ă
tur
ă
intim
ă
între tablouri
ş
i pointeri.În cazul unui pointer la o func
ţ
ie, tipul pointerului va fi tipul de dat
ă
returnat de c
ă
tre func
ţ
ie, iarvaloarea sa va fi adresa la care începe codul func
ţ
iei respective.Pentru lucrul cu pointeri, limbajul C ofer
ă
doi operatori: & 
ş
i * care se folosesc în fa
ţ
a numelui uneivariabile sau constante. Astfel, &x înseamn
ă
adresa variabilei x (de fapt adresa primului octet alloca
ţ
iei de memorie în care este stocat
ă
variabila x), iar *p1 valoarea stocat
ă
în loca
ţ
ie de memoriela care pointeaz
ă
pointerul p1.
Declararea
ş
i ini
ţ
ializarea pointerilor
Pointerii se declar
ă
ca orice variabil
ă
, deosebirea constând doar în faptul c
ă
numele lor esteprecedat de caracterul * care reprezeint
ă
operatorul unar de indirectare sau de dereferen
ţ
iere.
Exemple de loca
ţ
ii de memorie, adrese, pointer
 
Curs 7 Pointeri2
Pentru ini
ţ
ializarea pointerilor se poate folosi operatorul unar &, numit operator de referen
ţ
iere
ş
icare returneaz
ă
adresa argumentului s
ă
u.Declararea pointerilor se face în modul urm
ă
tor:
tip 
*
nume_pointer 
; sau
tip 
*
nume_pointer 
;unde
tip 
este un tip de date de baz
ă
sau tip utilizator, iar
nume_pointer 
este un identificator folositpentru pointerul care se declar
ă
.
Exemple 
1.
 
float *pf;
 
 //pf poate con
ţ
ine adrese la care se afl
ă
memorate date de tip
 
float
 
int *pi;
 
 //pi poate con
ţ
ine adrese la care se afl
ă
memorate date de tip
 
int
 
char* pc;
 //pc poate con
ţ
ine adrese la care se afl
ă
memorate date de tip
 
char
 
2.
 
struct agenda
{
char nume[20];char tel[15];};struct agenda *psa;
 //psa este un pointer la date de tip structur
ă
agenda.Ini
ţ
ializarea pointerilor const
ă
în precizarea adresei unui obiect definit în memorie. Dac
ă
p estenumele unui pointer, atunci *p reprezint
ă
valoarea de la adresa la care "pointeaz
ă
" pointerul p.
Exemple 
1.
 
double a, *pd;a=8.406;pd=&a;
2.
int n=1, m=2, s[10];
 
int *pi;
 // pi este un pointer la tipul întreg
 
pi = &n;
 
 // pi pointeaz
ă
acum la n
 
m = *pi;
 
 // m are valoarea de la adresa lui n, adic
ă
1
 
*pi = 0;
 // n are acum valoarea 0
pi = &s[0];
 
 // pi pointeaz
ă
acum la s[0], adic
ă
are ca // valoare adresa elementului s[0]
*pi=5*m;
 
 // s[0] are acum valoarea 5*1=5
 3.
float pi, *p;
 
p=π*p=3.14159;
Prin ultima instruc
ţ
iune i se atribuie de fapt lui pi valoarea 3.14159.La declarea
ş
i ini
ţ
ializarea pointerilor constan
ţ
i se va
ţ
ine cont de faptul c
ă
printr-o construc
ţ
ie deforma:
const int* pi=&i;
se declar
ă
un pointer neconstant la o constant
ă
întreag
ă
, iar printr-o construc
ţ
ie de forma:
int* const pi=&i;
se declar
ă
un pointer constant la un întreg.
 
Curs 7 Pointeri3
În primul caz pointerul pi poate lua diferite valori în timp ce i va fi o constant
ă
. În al doilea caz, întregul i poate fi modificat prin intermediul pointerului dar nu poate fi modificat pointerul pentru apointa la altceva.De asemenea, la declararea pointerilor într-o singur
ă
declara
ţ
ie se va
ţ
ine cont de faptul c
ă
printr-odeclara
ţ
ie de forma:
int* p1, p2, p3;
numai p1 este pointer, în timp ce p2
ş
i p3 sunt întregi. Astfel dac
ă
se dore
ş
te declararea tuturorcelor trei pointeri se poate proceda fie sub forma:
int *p1, *p2, *p3;
fie sub forma:
int* p1;int* p2;int* p3;
Prin declara
ţ
ia urm
ă
toare:
float *pf1, fact(int *);
se declar
ă
pointerul pf1 la tipul
 
float
 
ş
i o func
ţ
ie
fact 
care returneaz
ă
o valoare de tip float
ş
icare are ca argument un pointer la tipul
 
int
.
Un pointer este constrâns s
ă
pointeze la un anumit tip de date. Astfel, dac
ă
a fost declarat unpointer la tipul
float
, ca
ş
i în declara
ţ
ia de mai sus, atunci el nu va putea avea ca valori adreseale unor loca
ţ
ii de memorie unde sunt stocate date de tip întreg.
Program exemplu 
#include <stdio.h>#include <math.h>void main(){float a,b;float* p;p = &a;*p=4*atan(1.0);b=2*a;printf("a=%f b=%f",a,b);printf("\nValoarea din locatia de memorie la care pointeaza p este %f\nAdresa lui a: %X", *p, p);}
Output-ul acestui program este:
ş
i rezult
ă
dup
ă
parcurgerea etapelor schi
ţ
ate în figura urm
ă
toare:Dup
ă
sec
ţ
iunea de declara
ţ
ii, variabilele a
ş
i b au valori arbitrare, iar pointerul p, nefiind ini
ţ
ializat,poate pointa oriunde.Dup
ă
instruc
ţ
iunea
 
p=&a;
 
p va pointa la loca
ţ
ia de memorie rezervat
ă
variabilei a
ş
i va avea cavaloare adresa primului octet al acestei loca
ţ
ii.Dup
ă
instruc
ţ
iunea
 
*p=4*atan(1.0);
con
ţ
inutul loca
ţ
iei de memorie la care pointeaz
ă
p, adic
ă
 valoarea lui a, va fi de 4 ori arcul al c
ă
rui tangent
ă
este 1 (în radiani), adic
ă
3.141593, iar dup
ă
 instruc
ţ
iunea b=2*a;, valoarea variabilei b va fi 6.283185.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->