[ Durst @ 08.07.2003. 22:32 ] @
Imam jedno cisto teorijsko pitanje, koje glasi: Da li se indexom za kretanje kroz niz samo povecava identifikator niza koji je pointer ili je to reseno na neki drugi nacin. Tj. da li su a[10] i a + 10 identicne operacije na nivou kompajlera ili za svaku od njih postoje posebne instrukcije.
Imam utisak da je odgovor na ovo pitanje pozitivan, ali nisam siguran.
[ Predrag Damnjanovic @ 08.07.2003. 22:59 ] @
yap
a[10] = *(a+10)

imaj na umu da se pointer pomera za
10 * sizeof(T)
gde je T tip niza
dakle, pointer se ne pomera za 10 bajta (osim ako je sizeof(T)=1), vec za 10 * sizeof(T)

nizovi su obicni pokazivaci...
[ Durst @ 09.07.2003. 00:35 ] @
Hvala ti na otklanjanju nedoumice.
[ leka @ 10.07.2003. 20:18 ] @
Da, ali zar nisi mogo da napišeš prosto programče koje štampa adrese od a[10] i *(a+10) ??? :) Tako bi video da li grešiš ili ne. Blago meni ja sam tako učio svaki jezik, tako i ti (a i ostali budući programeri) trea da razmišljate - počnite da razmišljate na programerski način!
[ Durst @ 10.07.2003. 23:49 ] @
Ma to sam odradio, ali me je zanimalo da li postoje posebne operacije pri prevodjenju toga u masinski jezik. To je jedina nedoumica koju sam imao, a ne da li ce rezultat biti isti.

P.S.
Da su operacije razlicite onda bih se pitao koji od ta dva nacina je brzi, efikasniji itd.
[ Predrag Damnjanovic @ 11.07.2003. 00:10 ] @
kompajleri a[10] pretvaraju u *(a+10)

ili ako bas hoces nisko :
*(adresa_niza * velicina(tipa) * 10)
:)
[ alkal @ 11.07.2003. 10:43 ] @
Evo i zanimljivosti:
a[10] <=> *(a+10) <=> *(10+a) <=> 10[a]
Znači elementima niza možeš da se obraćaš u obliku indeks[niz].

[ filmil @ 11.07.2003. 11:20 ] @
Citat:

nizovi su obicni pokazivaci


Ne sasvim. Nizovi su labele koje pokazuju na prvi element niza.

To znači da su, kao i svaka druga labela, vezani za neko mesto u memoriji i da se na njih može primeniti pointerska aritmetika ali im se ne može dodeljivati vrednost (pošto labela ne može da menja mesto u memoriji!)

Dakle ako želite da uradite nešto poput

Code:

int a[10];
a += 5;


moraćete umesto gornjeg koda da odvojite jedan pointer za šetnju po nizu:

Code:

int a[10];
int *p
p = a + 5;


f
[ filmil @ 11.07.2003. 11:29 ] @
Citat:
Predrag Damnjanovic:
kompajleri a[10] pretvaraju u *(a+10)

ili ako bas hoces nisko :
*(adresa_niza * velicina(tipa) * 10)
:)


Ako si mislio na:
*(adresa_niza + velicina(tipa) * 10)

onda je tvoja logika neispravna, pošto je izraz u zagradi tipa int*, što će reći da se pointeri šetaju po intovima a ne po charovima. Drugim rečima, ovaj gornji izraz će se postaviti ne na deseti, nego na dvadeseti element niza (ako je tip 16-bitni), odnosno četrdeseti (ako je tip 32-bitni)! Podsećam te na tri pravila programiranja u C-u: careful, careful, careful.

f
[ Predrag Damnjanovic @ 11.07.2003. 20:53 ] @
ovo poslednje nema veze sa C-om, to je vise formula, da covek zna gde pokazuje pointer

zato sam namerno napisao 'adresa', a ne pointer
[ Durst @ 12.07.2003. 02:54 ] @
Hvala ljudi. Jeste malo overkill ali je i vrlo korisno i vredno daljeg varenja. Valjda cu uspeti da sve to razjasnim u glavi.