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

Przypisywanie wartości do zmiennej za pomocą funkcji (procedury)

Object Storage Arubacloud
0 głosów
550 wizyt
pytanie zadane 16 lipca 2018 w C i C++ przez mariuszd312 Nowicjusz (200 p.)
#include <stdio.h>

void wypelnij(int a)
{
    a=5;
}

int main()
{
    int a;

    wypelnij(a);

    printf("a=%d",a);

    return 0;
}

Dlaczego a nie jest równe 5? 

2 odpowiedzi

+2 głosów
odpowiedź 16 lipca 2018 przez Mariusz08 Maniak (62,300 p.)
edycja 16 lipca 2018 przez Mariusz08
Ponieważ w funkcji wypełnij() operujesz jedynie na kopii zmiennej, nie na samej zmiennej.
komentarz 16 lipca 2018 przez mariuszd312 Nowicjusz (200 p.)
Czyli jedynym rozwiązaniem jest zrobienie tego za pomocą wskaźników?
komentarz 16 lipca 2018 przez RafalS VIP (122,820 p.)
Jak to referencji? Chyba na kopii?
komentarz 16 lipca 2018 przez Mariusz08 Maniak (62,300 p.)

Nie jedynym; można to zrobić np. tak

#include <stdio.h>
 
int wypelnij()
{
    return 5;
}
 
int main()
{
    int a;
 
    a = wypelnij();
 
    printf("a=%d",a);
 
    return 0;
}

@RafalS

Ach, tak, faktycznie, na kopii, zrobiłem błąd.

1
komentarz 16 lipca 2018 przez RafalS VIP (122,820 p.)
W C tylko wskaznik. Mozna też użyć zmiennej globalnej ale to zła praktyka.
+2 głosów
odpowiedź 17 lipca 2018 przez Dubgron Mądrala (5,620 p.)

Sam przykład jest dość trywialny i nie wiem, jakie zastosowanie miałaby taka funkcja w Twoim programie, ale jeżeli chcesz zachować jej strukturę, to najłatwiej będzie przesyłać do niej wartość przez referencję (https://en.cppreference.com/w/cpp/language/reference) i wyglądałoby to tak:

void wypelnij(int& a)
{
    a=5;
}
 
int main()
{
    int a;
 
    wypelnij(a);
 
    printf("a=%d",a);
 
    return 0;
}

 

Problem polega na tym, że jeżeli przekazujesz do funkcji zmienną, to tworzona jest jej kopia, która zostaje usunięta wraz z zakończeniem działania funkcji. Jeżeli miałbym zobrazować, jak działa Twój program, to wyglądałoby to mniej więcej tak:

  1. tworzysz zmienną a1
  2. przesyłasz a1 do funkcji wypełnij
  3. funkcja kopiuje zmienną a1 do zmiennej a2
  4. zmieniasz wartość a2
  5. funkcja się kończy, a zmienna a2 zostaje usunięta 
  6. wyświetlasz zmienną a1

Jak widzisz, wartość zmiennej a1, przez cały czas trwania programu, nie zostaje zmieniona. To nazywa się przekazywaniem wartości przez zmienną (pass-by-value).


Używając referencji, nie kopiujemy oryginalnej zmiennej, lecz tworzymy do niej taki jakby alias, co pozwala nam operować na oryginalnej wartości (po bardziej szczegółowe wyjaśnienie zapraszam na https://en.cppreference.com/book/intro/reference). Kod. z użyciem referencji. działałby następująco:

  1. tworzysz zmienną a1
  2. przesyłasz a1 do funkcji wypełnij
  3. funkcja tworzy referencję a2 do zmiennej a1
  4. zmieniasz wartość a1, używając jej aliasu a2
  5. funkcja się kończy, a referencja a2 zostaje usunięta 
  6. wyświetlasz zmienną a1

W tym przypadku wartość a1 zostaje zmieniona. To nazywa się przekazywaniem wartości przez referencje (pass-by-reference).

 

Podobne pytania

0 głosów
2 odpowiedzi 1,524 wizyt
+1 głos
1 odpowiedź 328 wizyt
0 głosów
1 odpowiedź 452 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,966 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!

...