Pointer ako návratová hodnota funkcie
V minulých dieloch sme sa naučili, že funkcie môžu vraciať návratovú hodnotu, ktorá je nejakého typu, napr. int
, float
, double
či string
. Môže ale vrátiť pointer? To si ukážeme v sérii nasledujúcich príkladov.
Najprv si dajme príklad, ktorý by mohol byť potencionálne riešený cez pointer ako návratová hodnota funkcie. Nebojte sa, referenčným príkladom bude dobré známy faktoriál.
#include <iostream> using namespace std; int vypocetFaktorialu(int volba) { int faktorial = 1; for(int i = volba; i > 1; i--) { faktorial = i * faktorial; } return faktorial; } int main() { int volba; cout << "Zadajte cislo od 0 do 10 z ktoreho chcete vypocitat faktorial: "; cin >> volba; if(volba == 0 || volba == 1) { cout << "Faktorial cisla "<<volba<<" je: 1"; return 0; } if(volba < 0 || volba > 10) { cout << "Nepripustna operacia"; return 0; } cout << "Faktorial cisla "<<volba<< " je: "<<vypocetFaktorialu(volba)<<"\n"; return 0; }
Výsledok:
Zadajte cislo od 0 do 10 z ktoreho chcete vypocitat faktorial: 7 Faktorial cisla 7 je: 5040
Teraz skúsme funkciu int vypocetFaktorialu(int volba)
prepracovať tak, aby vrátila nie hodnotu typu int
, ale adresu na premennú typu int
, čiže pointer.
#include <iostream> using namespace std; int *vypocetFaktorialu(int volba) { int faktorial = 1; for(int i = volba; i > 1; i--) { faktorial = i * faktorial; } int *vysledok=new int; *vysledok=faktorial; return vysledok; } int main() { int volba; cout << "Zadajte cislo od 0 do 10 z ktoreho chcete vypocitat faktorial: "; cin >> volba; if(volba == 0 || volba == 1) { cout << "Faktorial cisla "<<volba<<" je: 1"<<"\n"; return 0; } if(volba < 0 || volba > 10) { cout << "Nepripustna operacia\n"; return 0; } cout << "Faktorial cisla "<<volba<< " je: "<<*vypocetFaktorialu(volba)<<"\n"; return 0; }
Čo sa zmenilo? Pridali sme symbol *
medzi int
a názvom funkcie, viď. int *vypocetFaktorialu(int volba)
. Nie je striktné obmedzené, kde presne dáte *
, ale musí byť medzi typom návratovej hodnoty a menom funkcie. Takže kľudne môžete napísať i takto: int* vypocetFaktorialu(int volba)
. Takto definovaná funkcia vracia adresu na premennú typu int
. Preto pri return
funkcie musí byť pointer a nie nejaká obyčajná premenná!
Posledná zmena je vo funkcii main
, kde voláme našu funkciu takto: *vypocetFaktorialu(volba)
. Keďže máme záujem vypísať priamu hodnotu pointeru, napíšeme k našej funkcii dereferenčný operátor *
.
Jednou z výhod adresy ako návratovej hodnoty funkcie môže byť, že celú problematiku pointerov riešite vo funkciách a v hlavnej funkcii main
už len priamo pristupujete k návratovým hodnotám funkcií. Takto môžete mať kód čitateľnejší a všetky dôležité veci riešite vo funkciách.
Kebyže len predsa chcete vytvárať pointery v hlavnej funkcii main()
, tak môžete použiť aj adresu ako návratovú hodnotu funkcie v deklarácii nového pointeru.
#include <iostream> using namespace std; int* vypocetFaktorialu(int volba) { int faktorial = 1; for(int i = volba; i > 1; i--) { faktorial = i * faktorial; } int *vysledok=new int; *vysledok=faktorial; return vysledok; } int main() { int volba; cout << "Zadajte cislo od 0 do 10 z ktoreho chcete vypocitat faktorial: "; cin >> volba; if(volba == 0 || volba == 1) { cout << "Faktorial cisla "<<volba<<" je: 1"<<"\n"; return 0; } if(volba < 0 || volba > 10) { cout << "Nepripustna operacia\n"; return 0; } int *faktorial=vypocetFaktorialu(volba); cout << "Faktorial cisla "<<volba<< " je: "<<*faktorial<<"\n"; return 0; }
Námet na tento článok poslúžili tieto zdroje:
Return Pointer from Functions in C++, tutorialspoint.com, dostupné online
C++ Examples: Returning a Pointer, functionx.com, dostupné online