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








