C++ podstawy i analiza kodu źródłowego

0

Witajcie!

Czas na nauke do egzaminu na której mam analize kodu programu c++.
Mam problem z ponizszym programem, nie wiem co dokladnie zachodzi w funkcji f5 a dokładnie chodzi o 'w' które pojawia się w zadaniu

 
void f5(int &a, int* b)
{
	a++;
	*b=++a;
}
void zadanie()
{
	int a[10]={1,2,3};
	int b[10]={3,2,1};
	int *w=b;
//wskaznik pobiera 1 element tablicy b czyli *w=3
	for (int i=0;i<3;i++,w++)
	{
		a[i]+=1;
		b[i]+=1;
//Pętla wykonywana jest 3 razy więc a[i]+1 bedzie rownież wykonane 3 razy?
		if(*w>3)
//Warunek spełniony *w=3 wiec wykonuje f5(a[i],w)
		f5(a[i],w);
		else
		f5(b[i],w);
		cout<<*(a+i)<<" "<<*(b+i)<<endl;
//Wypisanie i-tego elementu z tablicy a[i] b[i]
	}
	
}

Chciałbym żeby mi ktoś pomógł zrozumieć czym dokładnie jest 'w' w tym zadaniu i jak sie zachowuje w tablicach.
Dziekuje za pomoc.

1

w jest to wskaznik. Pokazuje na samym poczatku na poczatek tablicy

0

Okej to *w=b to akurat rozumiem ale nie moge zrozumieć tego 'w' które się pojawia f5(a[i],w); czy jest to ten sam wskaźnik w dalszym ciągu? Bo to w jest podstawiane do wskaźnika *b który jest preinkrementowany i już sam nie wiem co to ma wskazywać...

2

Jest, ale wskazuje już na inny element tablicy. Zobacz że jest inkrementowany w forze.

0

tak, a dlaczego mialby magicznie sie zmienic?

0

Rozumiem to tak:
Wskaźnik *w początkowo przybiera wartość 3 zostaje inkrementowany i jego wartość wynosi 4. Zostaje wykonany warunek f5(a[i],w); dla pierwszego elementu tablicy (a[0]) tylko następnie wskaźnik zmniejsza swoja wartość do 3 i 2? dlaczego?

1

Po pierwsze b w f5() to zupełnie inny byt niż b w zadanie().

Jeśli zmienimy nazwy parametrów, żeby się nie myliło:

void f5(int& foo, int* bar)
{
    foo++;
    *bar = ++foo;
}
void zadanie()
{
    int a[10] = { 1, 2, 3 };
    int b[10] = { 3, 2, 1 };
    int* w = b;

    for (int i = 0; i < 3; i++, w++) 
    {
        a[i] += 1;
        b[i] += 1;

        if (*w > 3)
            f5(a[i], w);
        else
            f5(b[i], w);

        cout << *(a + i) << " " << *(b + i) << endl;
    }
}

Po drugie bar to jest kopia wskaźnika w, cokolwiek zrobisz z bar nie ma wpływu na w.

Po trzecie *bar = ... to nie jest przypisanie do wskaźnika, tylko przypisanie do miejsca w pamięci gdzie wskazuje bar. Czyli wartość wskaźnika się nie zmienia, ciągle wskazuje na to samo miejsce, ale pod tym miejscem jest już inna liczba.

Darksaq napisał(a):

Wskaźnik *w początkowo przybiera wartość 3 zostaje inkrementowany i jego wartość wynosi 4.

Wskaźnik nie ma wartości 3. Odpal sobie taki kod:

int b[10] = { 3, 2, 1 };
int* w = b;
cout << "wartosc wskaznika: " << w << ", wartosc pod adresem gdzie wskazuje wskaznik: " << *w << endl;
0

Czyli wskaźnik pokazuje na adres a pod tym adresem znajduje sie dana liczba tablicy. To jak sie dzieje to, że pod adresem wskaźnika pojawia się liczba 4 i wykonany jest f5(a[i], w); dla pierwszego elementu tablicy? A nastepne operacje są dla 2 i 3 elementu tablicy b? (operacje - podwojenie tych wartości o 2) I tak w sumie czemu akurat o 2? (chyba bardzo dużo rzeczy jeszcze nie rozumiem :( )

1

Rozpisując pętlę for dostajesz coś takiego:

int i = 0;
{
    a[0] += 1; // a = { 2, 2, 3 }
    b[0] += 1; // b = { 4, 2, 1 }

    if (*w > 3)                            // w = &b[0], *w = 4
        f5(a[0], w);
    else
        f5(b[0], w);
}

i = 1;
w = &b[1];
{
    a[1] += 1; // a = { 4, 3, 3 }
    b[1] += 1; // b = { 4, 3, 1 }

    if (*w > 3)
        f5(a[1], w);
    else                         // w = &b[1], *w = 3
        f5(b[1], w);
}

i = 2;
w = &b[2];
{
    a[2] += 1; // a = { 2, 3, 4 }
    b[2] += 1; // b = { 4, 5, 2 }

    if (*w > 3)
        f5(a[2], w);
    else                          // w = &b[2], *w = 2
        f5(b[2], w);
}

I tak w sumie czemu akurat o 2?
Bo masz

foo++;
... = ++foo;
0

Chciałbym jeszcze zapytać o

void f5(int &a, int* b)
{
    a++;
    *b=++a;
} 

&a - czemu ta referencja jest tak ważna w voidzie? nie moglo by być samo a?
*b=++a; - zastąpienie to inkrementacja zmienia wartości dlaczego?

Znam teorie lecz nie umiem jej wykorzystać na poszczególnych zadaniach dlatego prosiłbym o wyjaśnienie.
Dziękuje

1
Darksaq napisał(a):

&a - czemu ta referencja jest tak ważna w voidzie? nie moglo by być samo a?
Nie, bo domyślnie parametr jest przekazywany przez wartość, czyli operujesz na kopii tego, co przekazujesz do funkcji.

*b=++a; - zastąpienie to inkrementacja zmienia wartości dlaczego?
Wartości czego? Jakie zastąpienie?
Generalnie czy rozumiesz różnicę między preinkrementacją a postinkrementacją?

0
 *b=++a; zastąpić *b=a++

Ale już rozumiem tą różnice. Dziękuje za wyjaśnienie. Ide walczyć z następnymi programami :)

1

Najlepiej zawsze na próbę powpisywać cout'y po każdej operacji/iteracji pętli, żeby zobaczyć co się dzieje w każdym momencie działania takiego programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1