Linux E X P R E S

Facebook

Programovanie v jazyku C++: Pointer ako návratová hodnota funkcie

cplusplus.png

Funkcie môžu vrátiť premenné typu int, float či string. Môžu však funkcie vrátiť pointer, čiže adresu na nejakú premennú? Odpoveď na túto otázku sa dozviete v článku.


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

Diskuze (10) Nahoru