CATEGORII DOCUMENTE |
Returnarea pointerilor
Desi functiile care intorc pointeri se manipuleaza in acelasi mod ca si celelalte tipuri de functii, trebuie discutate cateva concepte importante.
Pointerii la variabile nu sunt nici intregi, nici intregi fara semn. Pointerii sunt adrese de memorie a anumitor tipuri de date: int, char, float, double, struct etc.
Motivul acestei distinctii este legat de faptul ca atunci cand se prelucreaza un pointer aritmetic, aceasta prelucrare este dependenta de tipul datei indirectate: de exemplu, daca este increment un pointer la int, noua valoare (a adresei) va fi cu 4 mai mare fata de valoarea anterioara.
In general, cand un pointer este incrementat sau decrementat, acesta va indica catre elementul urmator, respectiv anterior, din tabloul pe care il indirecteaza. De exemplu, daca functia int f() returneaza un intreg, atunci functia int *f(), returneaza un pointer la o data de tip int.
Deoarece fiecare tip de date poate avea lungimi diferite, compilatorul trebuie 'sa stie' ce tip de data este indirectata de pointer, pentru a-l face sa indice corect spre urmatorul element.
Exemplu: Programul urmator contine o functie care intoarce un pointer intr-un sir in locul in care calculatorul gaseste o coincidenta de caractere.
char *match (char c, char *s)
Functia match() va incerca sa intoarca un pointer la locul (elementul) din sir unde calculatorul gaseste prima coincidenta cu caracterul c. Daca nu se gaseste nici o coincidenta, functia va intoarce un pointer la terminatorul de sir (NULL). Un scurt program ce ar utiliza functia match() este urmatorul :
# include <stdio.h>
# include <conio.h>
char *match(); // Prototipul functiei
void main (void)
else
printf('Nu exista nici o coincidenta'); }
Acest program citeste mai intai un sir si apoi un caracter. In cazul in care caracterul este in sir, atunci se tipareste sirul din punctul unde se afla caracterul, altfel se tipareste 'Nu exista nici o coincidenta'.
Un caz interesant este oferit de functiile care returneaza pointeri catre siruri de caractere. O astfel de functie se declara sub forma:
char *f()
Exemplu: Programul urmator arata modul in care se defineste, se declara si se apeleaza o astfel de functie.
# include <stdio.h>
void main(void)
char *NumeLuna(nr)
int nr;
;
return ((nr>=1) && (nr <= 12)?luna[nr]:luna[0]); }
Un alt exemplu va fi reprezentat de o varianta a functiei strcpy() din string.h , deci o functie care copiaza caracterele din sirul s2 in sirul s1. Rezultatul se gaseste in s1.
/* Vom incepe cu definirea functiei strcpy2() si apoi vom declara programul principal main(). In acest fel nu mai este necesara declararea prototipului functiei strcpy2() */
# include <stdio.h>
char *strcpy2(register char s1[],register char s2[])
void main()
Se observa cum se initializeaza s0 cu s1. Bucla while atribuie valorile (caracterele) (*s2) in locatiile indicate de pointerul s1, incrementand ambii pointeri simultan. Bucla se termina la intalnirea caracterului null, care se copiaza si el. Valoarea returnata, s0, retine adresa de inceput a sirului s1.
Un ultim exemplu il constituie un program de manipulare a unor matrici. Acest program realizeaza citirea unei matrici, transpunerea sa si respectiv afisarea rezultatului apeland la functiile cit_mat(), trans_mat() si tip_mat().
# include <stdio.h>
# define DIM_MAX 10
void cit_mat();
void tip_mat();
int *trans_mat();
void main()
void cit_mat(int p[][DIM_MAX], int lin, int col)
void tip_mat(int p[][DIM_MAX], int lin, int col)
printf('n'); }
int *trans_mat(int p[][DIM_MAX], int lin, int col)
return p; }
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 948
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved