[ SuperC @ 11.01.2007. 21:17 ] @
Posto tek ucim pokazivace, pokusavam da rijesim nekoliko zadataka, znaci ovo su pitanja sa testa, koja su vec bila. Aendern (njem.) znaci promijeni

Sta je ovdje rjesenje?


Citat:
#include <iostream>
using namespace std;
void aendern(int &u)
{
u = 30;
}
main() {

int a[] = {2,5,7,9};
cout << a[1] << endl;

int *p = a;
cout << *p << endl;

p = p + 1;
cout << *p << endl;
cout << *(p+1) << endl;

int* x = a;
aendern(*(x+2));
aendern(x[2]);
aendern(*(&a + 2));
cout << a[2] << endl;
}





Da li rjesenje ide ovako:
prvo ide 5 kao prvo cifra, zatim 2, jer *p ide na a, pa se poveca za jedan, znaci 5, pa opet za jedan se poveca, znaci 7

5257

i sta uraditi sa aendern (promijeni) ?

Ako imam pokazivac x na a..?
[ SuPeR_MaSteR @ 11.01.2007. 22:16 ] @
Ne znam sta je ovde nejasno.
Code:
int* x = a;

Deklarise se pointer x na tip int i inicijalizuje na adresu prvog elementa niza a.
Ekvivalentno tome je: int x = a[0];
Code:
aendern(*(x+2));

Funkciji aendern se salje element a[2], tj. sadrzaj pointera x + 2 (sto je <=> a[2])
Code:
aendern(x[2]);

Ovaj red bi trebao biti potpuno jasan, efekat je isti kao i u prethodnom.
Code:
aendern(*(&a + 2));

Opet je argument a[2] samo drugacije zapisano. a je sam po sebi pointer na prvi element niza a, znaci a <> a[0] (nepotrebno je koristiti operator &). Zatim se na a dodaje 2 sto je <=> a[0+2] => a[2]
Code:
cout << a[2] << endl;

Ispisuje se (nova) vrednost a[2] jer funkcija aendern stvara bocne efekte, tako da je vrednost a[2] = 30.

[ SuperC @ 11.01.2007. 22:24 ] @
hvala puno na detaljnom pojasnjenju, no kako si dosao do 30?? Ovdje prvo imas 2 i tri puta 7 to bi bilo 23, koji su bocni efekti funkcije aendern da si dobio vrijednost od 30?


Sta sa gornjim dijelom? Znaci li to da je ukupno rjesenje 5257 i 30 odnosno 525730??
[ SuPeR_MaSteR @ 11.01.2007. 22:57 ] @
Code:
void aendern(int &u)
{
   u = 30;
}

Koji god element niza a da prosledis kao argument ovoj funkciji, taj element postaje = 30.
Na izlazu se prikazuje:
Code:
5
2
5
7
30
[ SuperC @ 11.01.2007. 23:08 ] @
aaa, do mene, koji previd. hvala puno.

Jos jedno pitanje:

Code:
#include<iostream>
using namespace std;

void f (int *a, int &b)
{
    cout << *(a + 2) << b + 2; 
    b += *a;
}

int main()
{
    int feld[] = {4,2,1};

    int *a;
    a = (feld);

    f(feld, *a);
    cout << *a;
    return 0;
}



ja ovdje dobijem 11 kao rjesenje?
[ Mali Misha @ 11.01.2007. 23:17 ] @
Code:
a = (feld);
Nakon ovoga, a pokazuje na prvog člana niza feld.

Code:
f(feld, *a);
Funkcija dobija pokazivač na feld i referencu na *a tj. prvi član feld.

Code:
b += *a;
(U funkciji) Ovde se referenci na prvi član feld dodaje vrednost njegovog prvog člana. Tj. on postaje 4+4 = 8.

Nakon ovoga feld je {8,2,1}.

U funkciji štampa prvo *(a + 2) što je treći član niza: 1 pa potom (pre izmene) b+2, što je prvi član plus dva: 6. Po povratku u main stampa prvi član feld nakon izmene tj. 8.

Izlaz: "168".
[ SuperC @ 11.01.2007. 23:36 ] @
znaci ovdje se moze promijeniti vrijednost u polju. hvala puno.
[ Mali Misha @ 12.01.2007. 02:32 ] @
U principu ovde su pokazana dva načina pristupa elementima polja: preko pokazivača (Zeiger) i preko reference (Referenz). Evo školskog primera kako ovo radi.