Sunteți pe pagina 1din 14

Ministerul Educaiei Republicii Moldova Universitatea Tehnic a Moldovei Calculatoare, Informatic i Microelectronic

Referat
la programarea calculatorului
Tema: Pointeri

Lucrare de laborator nr.01

A efectuat: studenta gr AI!""" Ciobanica Marina A verificat:lector!asistent #a$u %ictoria

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

adresa unei variabile ci mai mult decit atit , anume :

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

adresa unei $one de memorie ;

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

Concluzei:+rogramul repre$entat mai sus efectuia$a scaderea a doi pointeri,

Sc$ema lo%ica a pro%ramului:


Start

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

"#emplul 2: Compararea a doi pointeri


> include ?stdio h@ > include ?conio h@ void main /0 A clrscr/0; int i, a D.E; for /i 5 !F; i?5"&; iKK0 CB se initiali$ea$a : BC aDiE 5 i; CB a D!FE 5 !F; a D!&E 5!&; BC CB aD'E5'; aD"E5";N BC

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

Sc$ema lo%ica a pro%ramului:

Start clrscr( ) i,a[+]

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

"#ercitiul 3: &eclararea pointerilor'pointer la pointer.


- i&clu.e ,st.i*/)0 - i&clu.e ,c*&i*/)0 - i&clu.e ,1at)/)0 2*i. 1ai& () { clrscr()3 i&t i, *pi, **ppi3 4* se .eclara u& i&tre( , u& p*i&ter *4 4* la i&t/ si u& p*i&ter la p*i&ter la i&t/ *4 pi = & i 3 ppi = & pi3 4* i&itializarea p*i&terului pi cu a.resa lui i *4 4* i&itializarea lui ppi cu a.resa lui pi *4

pri&t% ( 5 pi = 6p ppi = 6p 7 &5 , pi, ppi) 3 *pi = 73 4*8c)i2ale&t cu i = 7 *4

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:

Concluzie:Ca si in ca$ul oricaror tipuri de variabile si pointerii trebuie


cu deosebirea ca numele pointerului este precedat de caracterul B

declarati Ei se declara la fel,

*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

Sc$ema lo%ica a pro%ramului:


St*p

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

Sc$ema lo%ica a pro%ramului.


Start searc ) s= := *1ax=0 clrscr i++ i , & 9=0 9++ .a 9 , & t1[i][9]=t[i][9] &u &

i=0

.a

i=0 i++ &u .a i , & 9=0 &u

9++ i=0 i++ 9 , & t[i][9]

.a &u

&u

.a

i , & 9=0 9++ 9 , &

i=0

i++

i,& '1

.a t1[9][x]=t1[9] [;] .a t1[9][9]=' 1000

&u

.a

&u

9=i+1 &u .a &u 9 , & searc) () 1ax 9++ &u

s= =0 &u s0*1 ax .a *1ax=s

.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