Skocz do zawartości

Przekazywanie argumentów funkcji przez referencję, zmienna a tablica


Zygzak

Pomocna odpowiedź

Testuje sobie program. Pierwszy z nich wygląda tak:

#include <iostream>
using namespace std;

void set();
void reset(int& n);

int main()
{
    set();
}
void set() {
    int num = 10;
    cout << "Before reset: " << num << endl;
    reset(num);
    cout << "After reset: " << num << endl;
}
void reset(int& n) {
    n = 0;
}

Ustawiam wartość zmiennej i resetują ją poprzez przekazanie z referencją, wszystko działa, Otrzymuje wynik 10 i po resecie 0, W przypadku gdy mam funkcję bez operatora referencji (&) to wynik to 10 i 10, reset nie następuje, wszystko ok. W drugim programie zmieniam zmienną num na tablicę dwu elementową:

#include <iostream>
using namespace std;

void set();
void reset(int n[]);

int main()
{
	set();
}
void set() {
	int num[2] = { 10,20 };
	cout << "Before reset: " << num[0] << "," << num[1] << endl;
	reset(num);
	cout << "After reset: " << num[0] << "," << num[1] << endl;
}
void reset(int n[]) {
	n[0] = n[1] = 0;

}

I tu pojawia się problem, coś czego nie rozumiem. Mimo tego że nie zastosowałem referencji tzn mam: void reset(int n[]) a nie: void reset(int& n[]) program modyfikuje zmienną tak jakby pracował na oryginalnych danych (wyjście programu to 10,20 i po resecie 0,0), co więcej próba zadeklarowania funkcji jako void reset(int& n[]) skutkuje błędem podczas kompilacji. Czy dobrze rozumiem że jest to konsekwencja tego że operator [] jest także derefernecją? Jeśli w takim razie nie chce pracować w funkcji reset na oryginalnych danych to jedyne co mi pozostaje to ich przepisanie do nowej tablicy?

Link do komentarza
Share on other sites

2 minuty temu, Zygzak napisał:

Mimo tego że nie zastosowałem referencji tzn mam: void reset(int n[]) a nie: void reset(int& n[]) program modyfikuje zmienną tak jakby pracował na oryginalnych danych (wyjście programu to 10,20 i po resecie 0,0), co więcej próba zadeklarowania funkcji jako void reset(int& n[]) skutkuje błędem podczas kompilacji

Czyli wszeystko dziala...i zgadza sie program operuje na oryginale bo gdy podajesz nazwe tablicy to w rzeczywistosci podajesz adres na pierwszy element tej tablicy czyli juz nie potrzebujesz znaku pobrania adresu...nazwa tablicy jest wskaznikiem na jej pierwszy element

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.