limbaje 7

10
Limbaje de programare inginereşti Tema 7 C++: pointeri, funcţii

Upload: codrinamagda

Post on 23-Dec-2015

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Limbaje 7

Limbaje de programare inginereşti

Tema 7C++: pointeri, funcţii

Page 2: Limbaje 7

VARIABILE POINTER

Pointerii sunt variabile care au ca valori adresele altor variabile (obiecte).

Variabila este un nume simbolic utilizat pentru un grup de locaţii de memorie.

Valoarea memorată într-o variabilă pointer este o adresă.

Din punctul de vedere al conţinutului zonei de memorie adresate, se disting următoarele categorii de pointeri: pointeri de date (obiecte) - conţin adresa unei variabile din memorie; pointeri generici (numiţi şi pointeri void) - conţin adresa unui obiect oarecare, de tip neprecizat; pointeri de funcţii - conţin adresa codului executabil al unei funcţii.

Page 3: Limbaje 7

DECLARAREA VARIABILELOR POINTER

Sintaxa declaraţiei unui pointer de date este:tip *identificator_pointer;Simbolul * precizează că identificator_pointer este numele unei variabile pointer de date, iar tip este tipul obiectelor a căror adresă o va conţine.

Exemplu:int u, v, *p, *q; // *p, *q sunt pointeri de date (către int)double a, b, *p1, *q1; // *p1, *q1 sunt pointeri către date de tip double

Pentru pointerii generici, se foloseşte declaraţia:void *identificator_pointer;

Exemplu: void *m;

Page 4: Limbaje 7

INIŢIALIZAEA VARIABILELOR POINTER

Există doi operatori unari care permit utilizarea variabilelor pointer: & - operatorul adresă (de referenţiere) - pentru aflarea adresei din memorie a unei variabile;* - operatorul de direcţionare (de deferenţiere) - care furnizează valoarea din zona de memorie spre care pointează pointerul operand.

Exemple: - aplicatie –

int x, y, *q; q=&x;*q=8; // echivalentă cu x=8;q=&5; // invalidă - constantele nu au adresă*x=9; // invalidă - x nu este variabilă pointerx=&y; //invalidă: x nu este variabilă pointer, deci nu poate fi folosită cu operatorul de deferenţiere y=*q + 3; // echivalentă cu y=x+3;*q = 0; // setează x pe 0*q += 1; // echivalentă cu (q)++ sau cu x++

Page 5: Limbaje 7

POINTERI GENERICI

La declararea pointerilor generici ( void nume; ) nu se specifică un tip, deci unui pointer void i se pot atribui adrese de memorie care pot conţine date de diferite tipuri: int, float, char, etc. Aceşti pointeri pot fi folosiţi cu mai multe tipuri de date, de aceea este necesară folosirea conversiilor explicite pentru a preciza tipul datei spre care pointează la un moment dat pointerul generic. void *v1; int a, *q1, *q2;q1 = &a; v1 = q1;q2 = (int *) v1;

Page 6: Limbaje 7

Funcţia reprezintă o aplicaţie definită pe o mulţime D, cu valori în mulţimea C, care îndeplineşte condiţia că oricărui element din D îi corespunde un unic element din C.

Sintaxătip_val_return nume_func (lista_declaraţiilor_param_ formali){declaraţii_variabile_localeinstrucţiunireturn valoare}

STRUCTURA UNEI FUNCŢII

Page 7: Limbaje 7

Execuţia programului începe cu funcţia principală, numită main Funcţiile pot fi descrise în cadrul aceluiaşi fişier, sau în fişiere diferite O funcţie este formata din antet si corp Dacă funcţia nu întoarce nici o valoare, în locul tip_val_return se specifică void Dacă tip_val_return lipseşte, se consideră, implicit, că acesta este int Dacă funcţia întoarce o valoare, se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia apelantă. Nu este admisă definirea unei funcţii în corpul altei funcţii.

FUNCŢII

Page 8: Limbaje 7

Sintaxa:nume_funcţie (lista_parametrilor_efectivi);

Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip Variabilele declarate în interiorul unei funcţii, cât şi parametrii formali ai acesteia nu pot fi accesaţi decât în interiorul acesteia. Aceste variabile sunt numite variabile locale şi nu pot fi accesate din alte funcţii

APELUL ŞI PROTOTIPUL FUNCŢIILOR

Page 9: Limbaje 7

Exerciţiu: Să se scrie un program care citeşte două numere şi afişează cele mai mare divizor comun al acestora, folosind o funcţie care îl calculează.

#include <iostream.h>int cmmdc(int x, int y){if (x==0 || y==1 || x==1 || y==0) return 1;if (x<0) x=-x;if (y<0) y=-y;while (x != 0){

if ( y > x ){int z=x; x=y; y=z; }x%=y;

}return y;}

void main(){int n1,n2; cout<<”n1=”;cin>>n1; cout<<”n2=”;cin>>n2;int diviz=cmmdc(n1,n2);cout<<”Cel mai mare divizor comun al nr-lor:”<<n1<<” şi ”;cout<<n2<<” este:”<<diviz<<’\n’;

Page 10: Limbaje 7