• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja licząca kwadrat i przekazująca wynik do zmiennej

Object Storage Arubacloud
0 głosów
3,705 wizyt
pytanie zadane 24 stycznia 2017 w C i C++ przez Escalator Nowicjusz (120 p.)
edycja 24 stycznia 2017 przez Eryk Andrzejewski

Witam forumowiczów. Czy ktoś mógłby mi wytłumaczyć jak działają wskaźniki i przekazywanie poprzez referencje na tym konkretnym przykładzie?

Napisz funkcję kw(int a, int *b) , która policzy kwadrat przekazanej liczby całkowitej a i zapisze ją w zmiennej b. Wywołaj funkcję i wypisz wynik.

Jak narazie tyle rozumiem:  

 

int kw (int a, int * b)
{
    a=a*a;
    a= &b ;
}

 

komentarz 24 stycznia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Kod proszę wrzucać w bloczek - poradnik znajduje się w FAQ.

2 odpowiedzi

+2 głosów
odpowiedź 24 stycznia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

No popatrz

Napisz funkcję kw(int a, int *b) , która policzy kwadrat przekazanej liczby całkowitej a i zapisze ją w zmiennej b. Wywołaj funkcję i wypisz wynik.

Czyli ta funkcja ma dwa argumenty. Pierwszy z nich to wartość, którą mamy podnieść do kwadratu. Drugi argument to wskaźnik. Prawdopodobnie w zadaniu chodziło o to, że mamy wyliczoną wartość zapisać pod adres, na który wskazuje wskaźnik b. Musimy jednak uważać, żeby nie zacząć nadpisywać niezaalokowanej pamięci.

void kw(int a, int *b)
{
    if (b != NULL)
    {
        *b = a * a;
    }
}

Używamy operatora dereferencji, czyli wyłuskania (czyli po prostu gwiazdki, postawionej przed nazwą wskaźnika). Kwadrat liczby to jak wiadomo a * a. Czyli pod adres, na który wskazuje wkaźnik b, przypisujemy wartość wyrażenia a * a, czyli kwadrat liczby a.

Bardzo istotne jest sprawdzenie, czy pamięć pod wskaźnikiem została zaalokowana. Nie trzeba pisać warunku

if (pointer != NULL)
{
    ...
}

Można po prostu równie dobrze napisać:

if (pointer)
{
    ...
}

Gdzie pointer to oczywiście jakiś wskaźnik.

komentarz 24 stycznia 2017 przez Escalator Nowicjusz (120 p.)

Dziękuję, jakby zatem wyglądała sytuacja, gdybym chciał wpisać liczbę i wywołać funkcję w main?

void kw(int a, int * b)
{ 

     cout << "Podaj liczbę: " << endl; 
     cin >> a; 

if (b != NULL)
{
       *b=a*a;

}
}




 

komentarz 24 stycznia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Ale to ty piszesz w C, czy w C++? Bo w tagach widzę C, a po twoim kodzie C++ wink

Ja bym to zrobił tak:

#include <iostream>

void kw(int a, int* b)
{
    if (b) 
    {   
        *b = a * a;
    }   
}

int main()
{
    std::cout << "Podaj liczbę a: ";
    int a;
    std::cin >> a;
    
    int* b = new int;

    kw(a, b); 
    
    if (b)
    {
        std::cout << "Wynik to " << *b << "\n";
    }
    else
    {
        std::cout << "Coś nam nie poszło\n";
    }
}

Umieszczanie tego couta wewnątrz funkcji kw jest bez sensu, po to jest parametr a, żeby wartość podać w miejscu wywołania funkcji.

0 głosów
odpowiedź 7 listopada 2019 przez mmarszik Mądrala (7,390 p.)

Raz wskaźnik, drugi raz referencja:

https://github.com/mmarszik/eduSquareToPointer/tree/master

 

#include <iostream>

static double getN() {
    std::cout << "Podaj zmienną: ";
    double n;
    std::cin >> n;
    return n;
}

static void sqrP( const double n, double * const retVal ) {
    *retVal = n * n;
}

static void sqrR( const double n, double &retVal ) {
    retVal = n * n;
}

int main(int argc, char *argv[])
{
    const double n = getN();

    {
        double retVal;
        sqrP( n , &retVal );
        std::cout << "Wynik [1] " << n << " * " << n << " = " << retVal << std::endl;
    }

    {
        double retVal;
        sqrR( n , retVal );
        std::cout << "Wynik [2] " << n << " * " << n << " = " << retVal << std::endl;
    }

    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 438 wizyt
0 głosów
4 odpowiedzi 4,467 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez esp0x309 Użytkownik (510 p.)
0 głosów
2 odpowiedzi 360 wizyt
pytanie zadane 24 listopada 2018 w C i C++ przez eSpring Początkujący (270 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...