Documente Academic
Documente Profesional
Documente Cultură
Referat
la programarea calculatorului
Tema: Pointeri
Chisinu, &'""
Cuprins:
1. Introducere
2. Sarcina
3. Concluzie
Introducere
()TIU(EA *E +)I(TER Un pointer este o variabila care are ca valoare adresa unei $one de memorie ,ona de memorie este o succesiune " , & , - , . sau mai multe locatii / octeti 0 consecutive de memorie Adresa unei $one de memerie este numarul de ordine a primei locatii de memorie / cea mai din stinga 0 1unt doua mari categorii de pointeri : pointeri catre variabile si pointeri catre functii *eci pointerii sunt variabile care contin adresa de memorie a unei alte variabile *in aceste considerente, pointerii se numesc si variabile de adresa +resupunem ca avem o variabila de tip 2ntreg numita entitate locali$ata la adresa de memorie '3"''' /adresele sunt automat asigante variabilelor de catre compilator0 *aca dorim sa referim aceasta variabila prin intermediul unui pointer entitate_ptr, atunci valoarea pointerului va fi '3"''' /entitate4ptr 5 '3"'''0, astfel spunem ca entitate_ptr 6arata6 spre variabila entitate /+entru a se evita confu$iile, se recomanda ca numele pointerilor sa aiba sufi3ul _ptr0 +entru a 2ntelege mai bine mecanismul de functionare a pointerilor, introducem o analogie pointeri ! adrese postale, 2n care adresa de memorie este adresa postala, numele variabilei pointer este numele cladirii, iar entitatea referita este cladirea propriu!$isa Aceasta analogie este pre$entata 2n tabelul 7 " 1e observa ca doi pointeri diferiti / ac_!C si ac_"TC0 au aceeasi valoare, indic8nd spre aceeasi locatie, astfel referind aceeasi entitate Analogie pointeri ! %ariabila /nume pointer0 %aloare adresa Entitate adrese postale 9ac4AC :d % +8rvan & Cladire Electro
+ointerii se utili$ea$a pentru a face referite / a avea acces 0 la valoarea unei variabile atunci cind se cunoaste adresa ei *ar o variabila se memorea$a intr ! o $ona de memorie de o anumita lungime , functie de tipul ei *e e3emplu , o variabila de tip int se memorea$a pe doi octeti , pe cind una de tip float pe - octeti *e aici urmea$a ca un pointer nu repre$inta numai
tipul variabilei / int , char , double etc 0 care este memorata in acea $ona de memorie (otiunea de pointer face ca limba<ul C sa fie un puternic instrument de programare , mai
ales la indemina programatorilor avansati Recomandam ca utili$area pointerilor sa se faca numai dupa intelegerea clara a mecanismului de lucru cu adrese, intrucit, folositi fara discernamint, asa cum actionea$a insasi creatorii limba<ului: : =ernigham si * Ritechie, ei repre$inta o cale sigura de a scrie programe imposibil de inteles si uneori generatoare de erori ciudate / pointerii neinitiali$ati, distrugerea unor $one de memorie etc 0
Exemple:
"#emplul nr1: Scaderea a doi pointeri
> include ?stdio h@ > include ?conio h@ > include ?math h@ void main /0 A clrscr/0; int B pl, Bp&; CB se declara doi pointer de tip int BC int 3 D E 5 A ',",&,F,-,G,H,7I; CB se declara un sir de . intregi care se initiali$ea$a BC pl 5 J 3 D & E; CB +ointerul pl se initiali$ea$a cu adresa lui 3 D&E Echivalent cu : pl 5 3 K & ; BC p& 5 3 K 7; CB+ointerul p& se initiali$ea$a cu adresa de inceput a lui 3 plus inca 7 locatii a cate
& octeti adica cu adresa lui 3 D7E Echivalent cu : p& 5 J 3 D 7E; printf /63 5 Lu pl 5 Lu p&5 Lu Mn6, 3,pl,p&0; printf /6*iferente: pl ! 3 5 Lu p& ! 3 5 Lu p&! p" 5 Lu Mn6, pl ! 3, p& ! 3, p& ! pl0; getch/0; I Rezultatul: BC
in general scaderea a doi pointeri este o operatie ilegala, cu cateva e3ceptii Astfel, daca pointerii sunt de acelasi tip , in sensul ca se refera la obiecte de acelasi tip, ei se pot scade si re$ultatul scaderii este un intreg int ,ca in ca$ul e3emplului nostru, sau long / functie de modelul de memorie0 egal cu numarul de locatii de memorie capabile sa memore$e o valoare de tipul comun al pointerilor e3istente intre adresa primului si adresa celui de!al doilea Re$ultatul este po$itiv daca primul pointer este o adresa aflata la dreapta adresei din cel de!al doilea pointer si negativ in ca$ contrar In e3emplul dat se efectuia$a scaderea cand cei doi pointeri p",p& indica spre elementele aceluiasi tablou si in aceasta situatie re$ultatul este egal cu numarul de elemente dintre cei doi indici: po$itiv daca indicele l @ indicele & si negativ in ca$ contrar
ctrscr( ) *pi,*p2
x[]={0,1,2,3, ,!,",7#
pl=&x[2]
p2=x+7
x,p1,p2
$i%ere&te:
p1'x,p2'x,p2'p1
(etc)()
St*p
CB aD7E57;N; a D"&E5"&; BC printf /6aD!FE5 Ld a D&E 5 Ld a D"&E 5 Ld Mn6, B/a!F0, B/aK&0, a D"&E 0; printf /6 $ona neinitiali$ata aD!-E 5 Ld6, aD!-E 0; getch/0;
I Re$ultatul:
Concluzie : +entru ca operatia de comparare sa fie valida, cei doi pointeri trebuie sa indice
catre doua elemente ale aceluiasi tablou si re$ultatul comparatiei este egal cu re$ultatul comparatiei celor doi indici *e asemenea ,din pointerul a se poate scade orice intreg si compilatorul C
nu verifica depasirea limitei din stanga a sirului Intr!adevar la fel ca si la adunare cu intrgi : a O F este identic cu J a D !FE, iar /a!F0 este identic cu aD!FE *eci, in limba<ul C utili$area inde3ului negativ sau a inde3ului mai mare decat dimensiunea ma3ima este permisa asa cum se ilustrea$a in urmatorul e3emplu
i='3 i++
i,=1 2
a[i]=i
a['3],a[2],a[12]
*(a'3),a[12],*(a+2)
z*&a &ei&itializata
a[ ]
a[' ]
St*p
pri&t% (5 i = 6. 7 & 5, i )3 i = *pi ' 3 3 pri&t% ( 5 i = 6 . 7 & 5, i) 3 *pi = **ppi*23 pri&t% ( 5 i = 6 . 7 & 5, i) 3 (etc)()3 # Rezultatul:
*eclaratia de pointer in e3emplul nostrum este: int Bp BBpp;si prin aceasta se preci$ea$a ca nume este un pointer catre o $ona de memorie care contine valoarea unei variabile de tipul tip Este permisa si notiunea de Ppointer la pointerQ Astfel prin : int B B ppi ;se declara PppiQ ca fiind un pointer la un pointer de tip int altfel spus ppi contine adresa unei $one de memorie ce contine un numar de tip int
clrscr() *pi,**ppi
pi=&i
ppi=&pi
pi,ppi
*pi=7
i=*pi'3
*pi=**pi*2
i (etc)( St*p
2.Sarcin(
Se .e%i&este ca .*ua c*l*a&e ale 1atricei .ate $={. i , 9 # , i=1,&3 9=i,&3 su&t ase1a&at*are .aca c*i&ci. cite u& set .e 2al*ri ale acest*r c*l*a&e, i&.i%ere&t .e i&ceputul setului/ $e calculat pe&tru $ lu&(i&ea 1axi1ala a seturil*r si &u1arul .e c*l*a&e &ease1a&at*are/
Listin%ul pro%ramului.
)include *stdio.$+ )include *conio.$+ )include*mat$.$+ int t,-0.,-0.'n'/ma#00'1002 void sears$3int #'int 45 6 int i'7's00't1,-0.,-0.2 8or3i002i*n2i995 8or370027*n27995 t1,i.,7.0t,i.,7.2 8or3i002i*n2i995
6 8or370027*n27995 i83t1,i.,#.00t1,7.,4.5 6 s992 t1,7.,4.0:10002 brea12 ; ; i83s00051992 else i8 3s+/ma#5 /ma#0s2 ; void main35 6 clrscr352 int i'72 print83<introdu n=n<52 scan83<>d<'?n52 print83<=nintrodu elementele matricei =n<52 8or3i002i*n2i995 8or370027*n27995 scan83<>d<'?t,i.,7.52 8or3i002i*n:12i995 8or370i9127*n27995 sears$3i'752 print83<=nlun%imea ma#ima a seturilor este:>d=n<'/ma#52 print83<=nnumarul de coloane neasemanatoare este: >d=n<'152 %etc$352
i=0
.a
.a &u
&u
.a
i=0
i++
i,& '1
&u
.a
&u
.a
: (etc) ()
St*p St*p
@ezultatele obinute
3.Concluzie:
Efectuind lucrarea de laborator numarul " ,am facut cunostinta cu notiunea de pointer si necesitatea folosirii lor in programe anali$ind mai multe e3emple Totusi folositi cu economie
si disciplina, ei dau nastere la programe clare si simple, si de cele mai multe ori mai rapide decit in varianta fara pointeri