Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Pokazivači, polje kao argument funkcije (objasnjenje gradiva)
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
misurka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 03. 2008. (18:52:46)
Postovi: (10)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 21:35 ned, 9. 3. 2008    Naslov: Pokazivači, polje kao argument funkcije Citirajte i odgovorite

Zanima me slijedeće, u ovoj funkciji:
void ispis (int *a, int n){
int i;
for(i=0; i<n; i++)
printf("%d", *a++); }

što zapravo radi ovaj *a.
U primjerima kada je taj bio u mainu, to je značilo da pristupamo vrijednosti na koju pokazuje a i nju povećavamo. Je li?
A ovdje bi trebao značiti da adresu postupno povećavamo za 1 i onda ispisujemo vrijednost na toj adresi, dakle, elemente niza. A nije mi jasno zašto onda ne može pisati a++, zar nije to povećanje vrijednosti od a, koja je upravo adresa prvog elementa niza.
A onda, ne znam smijemo li kada je polje argument funkcije mijenjati a, koji je konstantni pokazivač na adresu prvog elementa? Vrijedi li to pravilo uvijek?

U vezi ovoga a++, to sam vidjela u jednom primjeru u mainu, povećavali smo pokazivač dakle a i onda tek pristupali vrijednosti elemenata polja preko *a.
Zanima me slijedeće, u ovoj funkciji:
void ispis (int *a, int n){
int i;
for(i=0; i<n; i++)
printf("%d", *a++); }

što zapravo radi ovaj *a.
U primjerima kada je taj bio u mainu, to je značilo da pristupamo vrijednosti na koju pokazuje a i nju povećavamo. Je li?
A ovdje bi trebao značiti da adresu postupno povećavamo za 1 i onda ispisujemo vrijednost na toj adresi, dakle, elemente niza. A nije mi jasno zašto onda ne može pisati a++, zar nije to povećanje vrijednosti od a, koja je upravo adresa prvog elementa niza.
A onda, ne znam smijemo li kada je polje argument funkcije mijenjati a, koji je konstantni pokazivač na adresu prvog elementa? Vrijedi li to pravilo uvijek?

U vezi ovoga a++, to sam vidjela u jednom primjeru u mainu, povećavali smo pokazivač dakle a i onda tek pristupali vrijednosti elemenata polja preko *a.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 22:57 ned, 9. 3. 2008    Naslov: Citirajte i odgovorite

Ovak ja to shvaćam:

Šalješ fji pointer na prvi element polja (*a) .

Sa for petljom ideš n puta, al ne pristupaš ustvari a[i] nego ispisuješ ono na što pokazuje *a. Prvo pokazuje na a[0] pa ga ispišeš, i povećaš *a (tj povećaš adresu na koju pointer pokazuje pa sad pokazuje na a[1] )...

Ti ustvari fji ne šalješ cijelo polje, nego samo pointer na prvi element. U polju su ti elementi jedan za drugim pa onda *a++ ima smisla, tj pomaknut će se na ono što ima neku željenu vrijednost.
Ovak ja to shvaćam:

Šalješ fji pointer na prvi element polja (*a) .

Sa for petljom ideš n puta, al ne pristupaš ustvari a[i] nego ispisuješ ono na što pokazuje *a. Prvo pokazuje na a[0] pa ga ispišeš, i povećaš *a (tj povećaš adresu na koju pointer pokazuje pa sad pokazuje na a[1] )...

Ti ustvari fji ne šalješ cijelo polje, nego samo pointer na prvi element. U polju su ti elementi jedan za drugim pa onda *a++ ima smisla, tj pomaknut će se na ono što ima neku željenu vrijednost.



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
misurka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 03. 2008. (18:52:46)
Postovi: (10)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 23:16 ned, 9. 3. 2008    Naslov: Citirajte i odgovorite

Ali što će onda raditi a++?
Jer u svim primjerima koje smo radili (u mainu, zato se i pitam je li to uzrokuje razliku) a++ povećava vrijednost pointera, dakle adresu neke varijable na koju a pokazuje, i tek onda smo s *a pristupali vrijednostima.
Po toj logici, ovo *a++ bi značilo da ja vrijednost povećavam, vrijednost na elementima polja, a to nije ono što želimo..

I još, zar nisu i * i ++ unarni operatori, pa idu s desna na lijevo. Aha, pa sad sam nešto novo uočila! Pa šta nije onda ovo da, prvo povećam vrijednost od a, i tek onda gledam na koju sada vrijednost pokazuje. Da, to bi moglo biti to, zbog aritmetike unarnih operatora. Slažeš li se?
Ali što će onda raditi a++?
Jer u svim primjerima koje smo radili (u mainu, zato se i pitam je li to uzrokuje razliku) a++ povećava vrijednost pointera, dakle adresu neke varijable na koju a pokazuje, i tek onda smo s *a pristupali vrijednostima.
Po toj logici, ovo *a++ bi značilo da ja vrijednost povećavam, vrijednost na elementima polja, a to nije ono što želimo..

I još, zar nisu i * i ++ unarni operatori, pa idu s desna na lijevo. Aha, pa sad sam nešto novo uočila! Pa šta nije onda ovo da, prvo povećam vrijednost od a, i tek onda gledam na koju sada vrijednost pokazuje. Da, to bi moglo biti to, zbog aritmetike unarnih operatora. Slažeš li se?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
misurka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 03. 2008. (18:52:46)
Postovi: (10)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 23:20 ned, 9. 3. 2008    Naslov: Citirajte i odgovorite

Dakle, (*a)++ bi bilo netočno, je li?? to bi bilo ovo o čemu sam govorila gore da me zbunjuje.

I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??
Dakle, (*a)++ bi bilo netočno, je li?? to bi bilo ovo o čemu sam govorila gore da me zbunjuje.

I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 23:26 ned, 9. 3. 2008    Naslov: Citirajte i odgovorite

Sa (*a)++ bi ispisivala a[1] pa a[2], ... pa a[n], ne bi bilo a[0] a i a[n] je nešt bezveze u memoriji.

Ovdje je * 'jači' pa prvo radi *a pa ga tek onda poveća.

I nije ti *a konstantan pokazivač, zašto bi bio? Na početku on pokazuje na 0. element polja, al nitko ne kaže da ga ne smiješ mijenjat...
Sa (*a)++ bi ispisivala a[1] pa a[2], ... pa a[n], ne bi bilo a[0] a i a[n] je nešt bezveze u memoriji.

Ovdje je * 'jači' pa prvo radi *a pa ga tek onda poveća.

I nije ti *a konstantan pokazivač, zašto bi bio? Na početku on pokazuje na 0. element polja, al nitko ne kaže da ga ne smiješ mijenjat...



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 1:14 pon, 10. 3. 2008    Naslov: Re: Pokazivači, polje kao argument funkcije Citirajte i odgovorite

[url=http://www.swansontec.com/sopc.html]Kao sto mozemo vidjeti[/url] operator postinkrementa ([tt]++[/tt]) ima veci prioritet od operatora dereferenciranja ([tt]*[/tt]), dakle izraz [tt]*a++[/tt] je isto sto i izraz [tt]*(a++)[/tt]

Prema tome, petlja
[code:1]
for(i=0; i<n; i++)
printf("%d", *a++);
[/code:1]
u svakom koraku ispise ono sto se nalazi na adresi cija je vrijednost spremljena u varijablu [tt]a[/tt] (tj. ono na sto [tt]a[/tt] pokazuje), a zatim inkrementira [tt]a[/tt] (tj. pomakne pointer tako da pokazuje na sljedeci element u polju).

[b]Sto se ispisa tice[/b], isti efekt bi imala petlja
[code:1]
for(i=0; i<n; i++)
printf("%d", a[i]);
[/code:1]
no, ova petlja za razliku od gornje ne bi promijenila vrijednost varijable [tt]a[/tt].
Kao sto mozemo vidjeti operator postinkrementa (++) ima veci prioritet od operatora dereferenciranja (*), dakle izraz *a++ je isto sto i izraz *(a++)

Prema tome, petlja
Kod:

for(i=0; i<n; i++)
  printf("%d", *a++);

u svakom koraku ispise ono sto se nalazi na adresi cija je vrijednost spremljena u varijablu a (tj. ono na sto a pokazuje), a zatim inkrementira a (tj. pomakne pointer tako da pokazuje na sljedeci element u polju).

Sto se ispisa tice, isti efekt bi imala petlja
Kod:

for(i=0; i<n; i++)
  printf("%d", a[i]);

no, ova petlja za razliku od gornje ne bi promijenila vrijednost varijable a.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Markec
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 02. 2003. (14:49:45)
Postovi: (134)16
Spol: muško
Sarma = la pohva - posuda
-3 = 37 - 40

PostPostano: 1:39 pon, 10. 3. 2008    Naslov: Citirajte i odgovorite

ono sta je mozda ostalo neodgovoreno ovdje:

[quote="misurka"]
I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??[/quote]


a je [b]lokalna[/b] varijabla
u main-u (ako je tamo definirano polje) nebi to mogla napraviti.

odnosno adresa tvog polja je [b]samo kopirana[/b] u lokalnu varijablu a, s kojom mozes radit kaj god hoces...

Znaci ovo ne funkcionira:

[code:1]
int main()
{
int a[]={1,2,3};

*a++;

return 0;
}


[/code:1]
ono sta je mozda ostalo neodgovoreno ovdje:

misurka (napisa):

I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??



a je lokalna varijabla
u main-u (ako je tamo definirano polje) nebi to mogla napraviti.

odnosno adresa tvog polja je samo kopirana u lokalnu varijablu a, s kojom mozes radit kaj god hoces...

Znaci ovo ne funkcionira:

Kod:

int main()
{
int a[]={1,2,3};

*a++;

return 0;
}




[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 2:22 pon, 10. 3. 2008    Naslov: Citirajte i odgovorite

[quote="Markec"]ono sta je mozda ostalo neodgovoreno ovdje:

[quote="misurka"]
I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??[/quote]


a je [b]lokalna[/b] varijabla
[/quote]
Nije poanta u tome sto je [tt]a[/tt] lokalna varijabla, nego sto je funkcija deklarirana kao [tt]void ispis (int *a, int n);[/tt], pa je [tt]a[/tt] deklariran kao pointer na int, a ne kao konstantan pointer na int.

Da smo kojim slucajem htjeli da argument [tt]a[/tt] bude konstantan pointer na int (iako ne vidim cemu bi to sluzilo) onda bi deklaracija funkcije izgledala ovako:
[tt]void ispis (int * const a, int n);[/tt]
Markec (napisa):
ono sta je mozda ostalo neodgovoreno ovdje:

misurka (napisa):

I onda (ako sam u pravu za ovo navedeno), još ostaje pitanje kako ja smijem mijenjati na što pokazuje a, ako je on konstantan pokazivač, na prvi element polja??



a je lokalna varijabla

Nije poanta u tome sto je a lokalna varijabla, nego sto je funkcija deklarirana kao void ispis (int *a, int n);, pa je a deklariran kao pointer na int, a ne kao konstantan pointer na int.

Da smo kojim slucajem htjeli da argument a bude konstantan pointer na int (iako ne vidim cemu bi to sluzilo) onda bi deklaracija funkcije izgledala ovako:
void ispis (int * const a, int n);



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Markec
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 02. 2003. (14:49:45)
Postovi: (134)16
Spol: muško
Sarma = la pohva - posuda
-3 = 37 - 40

PostPostano: 2:51 pon, 10. 3. 2008    Naslov: Citirajte i odgovorite

[quote="mdoko"]
Nije poanta u tome sto je [tt]a[/tt] lokalna varijabla, nego sto je funkcija deklarirana kao [tt]void ispis (int *a, int n);[/tt], pa je [tt]a[/tt] deklariran kao pointer na int, a ne kao konstantan pointer na int.[/quote]

ok, neprecizan sam...

ali ono sto sam htio naglasiti je da su to dvije razlicite varijable..
[size=7](sad mi tek pada napamet kak je to glup naziv "konstantna varijabla")[/size]
mdoko (napisa):

Nije poanta u tome sto je a lokalna varijabla, nego sto je funkcija deklarirana kao void ispis (int *a, int n);, pa je a deklariran kao pointer na int, a ne kao konstantan pointer na int.


ok, neprecizan sam...

ali ono sto sam htio naglasiti je da su to dvije razlicite varijable..
(sad mi tek pada napamet kak je to glup naziv "konstantna varijabla")


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 12:27 uto, 11. 3. 2008    Naslov: Citirajte i odgovorite

Možda je ovako jasnije, sve je isto, samo ne ide odmah onaj ++:

[code:1]#include <stdio.h>

void ispis (int *a, int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d ", *a);
(*a)++;
}
}

int main()
{
int a[]={1,2,3,4,5,6};
ispis(a,6);
scanf("%%");
return 0;
}[/code:1]

Dakle, prvo pročita i ispiše ono na što pokazuje *a i onda ga poveća, tj pomakne na idući element polja (koji je na adresi++)...

I mene je zbunio taj ++, nikako da zapamtim što je 'jače', pa je možda bolje ovak pisat...

Isprike ako sam nekog zbunio. ;)
Možda je ovako jasnije, sve je isto, samo ne ide odmah onaj ++:

Kod:
#include <stdio.h>

void ispis (int *a, int n)
{
     int i;
     for(i=0; i<n; i++)
     {
     printf("%d ", *a);
     (*a)++;
     }
}

int main()
{
    int a[]={1,2,3,4,5,6};
    ispis(a,6);
    scanf("%%");
    return 0;
}


Dakle, prvo pročita i ispiše ono na što pokazuje *a i onda ga poveća, tj pomakne na idući element polja (koji je na adresi++)...

I mene je zbunio taj ++, nikako da zapamtim što je 'jače', pa je možda bolje ovak pisat...

Isprike ako sam nekog zbunio. Wink



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Markec
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 02. 2003. (14:49:45)
Postovi: (134)16
Spol: muško
Sarma = la pohva - posuda
-3 = 37 - 40

PostPostano: 13:32 uto, 11. 3. 2008    Naslov: Citirajte i odgovorite

[quote="Luuka"]Možda je ovako jasnije, sve je isto, samo ne ide odmah onaj ++:

[code:1]#include <stdio.h>

void ispis (int *a, int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d ", *a);
(*a)++;
}
}

int main()
{
int a[]={1,2,3,4,5,6};
ispis(a,6);
scanf("%%");
return 0;
}[/code:1]

Dakle, prvo pročita i ispiše ono na što pokazuje *a i onda ga poveća, tj pomakne na idući element polja (koji je na adresi++)...

I mene je zbunio taj ++, nikako da zapamtim što je 'jače', pa je možda bolje ovak pisat...

Isprike ako sam nekog zbunio. ;)[/quote]

moze i ovako:

[code:1]#include <stdio.h>

void ispis (int *a, int n)
{
int i;
for(i=0; ++i<=n; (*a)++)printf("%d ", *a);

}

int main()
{
int a[]={1,2,3,4,5,6};
ispis(a,6);
scanf("%%");
return 0;
}
[/code:1]
Luuka (napisa):
Možda je ovako jasnije, sve je isto, samo ne ide odmah onaj ++:

Kod:
#include <stdio.h>

void ispis (int *a, int n)
{
     int i;
     for(i=0; i<n; i++)
     {
     printf("%d ", *a);
     (*a)++;
     }
}

int main()
{
    int a[]={1,2,3,4,5,6};
    ispis(a,6);
    scanf("%%");
    return 0;
}


Dakle, prvo pročita i ispiše ono na što pokazuje *a i onda ga poveća, tj pomakne na idući element polja (koji je na adresi++)...

I mene je zbunio taj ++, nikako da zapamtim što je 'jače', pa je možda bolje ovak pisat...

Isprike ako sam nekog zbunio. Wink


moze i ovako:

Kod:
#include <stdio.h>

void ispis (int *a, int n)
{
     int i;
     for(i=0; ++i<=n; (*a)++)printf("%d ", *a);
   
}

int main()
{
    int a[]={1,2,3,4,5,6};
    ispis(a,6);
    scanf("%%");
    return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 15:17 uto, 11. 3. 2008    Naslov: Citirajte i odgovorite

Ali to jednostavno nije ekvivalentno onome gore. :? Lijepo je Marko napisao da je
[tt]*a++[/tt] <=> [tt]*(a++)[/tt].
:)
Ali to jednostavno nije ekvivalentno onome gore. Confused Lijepo je Marko napisao da je
*a++*(a++).
Smile



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
misurka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 03. 2008. (18:52:46)
Postovi: (10)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 15:40 uto, 11. 3. 2008    Naslov: Citirajte i odgovorite

Hvala vam, jasno mi je. Čak i ovo da (*a)++ nije isto što i *a++!
Hvala vam, jasno mi je. Čak i ovo da (*a)++ nije isto što i *a++!


[Vrh]
Korisnički profil Pošaljite privatnu poruku
ekatarina
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 11. 2007. (19:22:50)
Postovi: (161)16
Spol: žensko
Sarma = la pohva - posuda
30 = 47 - 17

PostPostano: 18:03 pon, 7. 4. 2008    Naslov: Citirajte i odgovorite

Ali mi zapravo s tim a, koji je pokazivač na prvi element polja, ne možemo ništa. Je li? Ne možemo mijenjati njegovu vrijednost u mainu jer zapravo nemamo njegovu adresu, nego njegovu vrijednost, a to je eto adresa i zato u definiciji funkcije u parametru koji ga prima dolazi oznaka *p.
Je li to tako nekako?
Ali mi zapravo s tim a, koji je pokazivač na prvi element polja, ne možemo ništa. Je li? Ne možemo mijenjati njegovu vrijednost u mainu jer zapravo nemamo njegovu adresu, nego njegovu vrijednost, a to je eto adresa i zato u definiciji funkcije u parametru koji ga prima dolazi oznaka *p.
Je li to tako nekako?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 19:32 pon, 7. 4. 2008    Naslov: Citirajte i odgovorite

Adresa varijable [tt]a[/tt] je [tt]&a[/tt]. 8)

Ako nisam dobro razumio pitanje, molim te da malo detaljnije raspises sto pitas. :)
Adresa varijable a je &a. Cool

Ako nisam dobro razumio pitanje, molim te da malo detaljnije raspises sto pitas. Smile



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
ekatarina
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 11. 2007. (19:22:50)
Postovi: (161)16
Spol: žensko
Sarma = la pohva - posuda
30 = 47 - 17

PostPostano: 21:16 uto, 8. 4. 2008    Naslov: Citirajte i odgovorite

Pitala je misurka kako to da unutar neke funkcije smijemo mijenjati a koji je pokazivač na prvi element polja. I sad, osim toga što je on konstantan pokazivač samo u mainu, meni se učinilo da može biti da ga ne možemo mijenjati jer nemamo njegovu adresu.
Možda je zbunjujuće to što je on u definiciji funkcije naveden kao *a, to daje naslutiti (barem nama početnicima) da ćemo preko njega moći mijenjati neke vrijednosti u mainu. Ali, to neće biti njegova vrijednost, jer mi nismo funkciji poslali &a - njegovu adresu. Nego a, adresu prvog elementa polja. I zato ćemo moći promijeniti vrijednost svih elemenata polja, ali ne i konstantnog pokazivača...
ovo je sve ako, možda trkeljam bezveze...
Pitala je misurka kako to da unutar neke funkcije smijemo mijenjati a koji je pokazivač na prvi element polja. I sad, osim toga što je on konstantan pokazivač samo u mainu, meni se učinilo da može biti da ga ne možemo mijenjati jer nemamo njegovu adresu.
Možda je zbunjujuće to što je on u definiciji funkcije naveden kao *a, to daje naslutiti (barem nama početnicima) da ćemo preko njega moći mijenjati neke vrijednosti u mainu. Ali, to neće biti njegova vrijednost, jer mi nismo funkciji poslali &a - njegovu adresu. Nego a, adresu prvog elementa polja. I zato ćemo moći promijeniti vrijednost svih elemenata polja, ali ne i konstantnog pokazivača...
ovo je sve ako, možda trkeljam bezveze...


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 22:01 uto, 8. 4. 2008    Naslov: Citirajte i odgovorite

Nije li "njegova vrijednost u [tt]main()[/tt]-u" upravo vrijednost elemenata tog niza? :grebgreb: Preko onog [tt]a[/tt] u funkciji mozes mijenjati sve elemente niza (jer je [tt]a[i][/tt] isto sto i [tt]*(a+i)[/tt]). 8)

Ako zelis mijenjati niz, a ne njegove elemente (pomalo nespretno receno), trebaju ti dinamicki nizovi. :) Na primjer:

[code:1]#include <stdio.h>
#include <stdlib.h>

void alociraj_i_postavi(int **a, int n, int x) {
int i;
*a = (int*)malloc(n*sizeof(int));
for (i = 0; i < n; ++i) (*a)[i] = x;
}

int main(void) {
int *a, n = 7, i;
alociraj_i_postavi(&a, n, 17);
for (i = 0; i < n; ++i) printf("%d\n", a[i]);
free(a);
return 0;
}
[/code:1]

Funkcija ce alocirati dinamicki niz duljine [tt]n[/tt] i postaviti te vrijednosti na [tt]x[/tt]. :) U [tt]main()[/tt]-u je [tt]a[/tt] klasicni pointer (sto je u C-u ekvivalentno nizu, do na cinjenicu da pointer treba alocirati), no svejedno ga mijenjamo u funkciji (jer joj saljemo pointer na taj pointer). 8)

Pokusas li pomoci [tt]&[/tt] dobiti adresu niza (a ne pointera), vidjet ces da je to ista adresa kao i adresa nultog elementa niza (tj. [tt]&b[0][/tt] = [tt]b[/tt] = [tt]&b[/tt]), sto kod pointera nije slucaj:

[code:1]#include <stdio.h>

int main(void) {
int *a;
int b[10];
printf("%u %u %u\n", &a[0], a, &a);
printf("%u %u %u\n", &b[0], b, &b);
return 0;
}[/code:1]

To je zato jer je pointer (ovdje [tt]a[/tt]) varijabla koja sadrzi adresu niza (ili kakvog god podatka), dok je "niz" (ovdje [tt]b[/tt]) bas ta lokacija u memoriji na kojoj se niz nalazi. :) Zato su svi brojevi u drugom retku ovog zadnjeg programa jednaki. :)

Sad jasnije? :D
Nije li "njegova vrijednost u main()-u" upravo vrijednost elemenata tog niza? Kotacici rade 100 na sat Preko onog a u funkciji mozes mijenjati sve elemente niza (jer je a[i] isto sto i *(a+i)). Cool

Ako zelis mijenjati niz, a ne njegove elemente (pomalo nespretno receno), trebaju ti dinamicki nizovi. Smile Na primjer:

Kod:
#include <stdio.h>
#include <stdlib.h>

void alociraj_i_postavi(int **a, int n, int x) {
  int i;
  *a = (int*)malloc(n*sizeof(int));
  for (i = 0; i < n; ++i) (*a)[i] = x;
}

int main(void) {
  int *a, n = 7, i;
  alociraj_i_postavi(&a, n, 17);
  for (i = 0; i < n; ++i) printf("%d\n", a[i]);
  free(a);
  return 0;
}


Funkcija ce alocirati dinamicki niz duljine n i postaviti te vrijednosti na x. Smile U main()-u je a klasicni pointer (sto je u C-u ekvivalentno nizu, do na cinjenicu da pointer treba alocirati), no svejedno ga mijenjamo u funkciji (jer joj saljemo pointer na taj pointer). Cool

Pokusas li pomoci & dobiti adresu niza (a ne pointera), vidjet ces da je to ista adresa kao i adresa nultog elementa niza (tj. &b[0] = b = &b), sto kod pointera nije slucaj:

Kod:
#include <stdio.h>

int main(void) {
  int *a;
  int b[10];
  printf("%u %u %u\n", &a[0], a, &a);
  printf("%u %u %u\n", &b[0], b, &b);
  return 0;
}


To je zato jer je pointer (ovdje a) varijabla koja sadrzi adresu niza (ili kakvog god podatka), dok je "niz" (ovdje b) bas ta lokacija u memoriji na kojoj se niz nalazi. Smile Zato su svi brojevi u drugom retku ovog zadnjeg programa jednaki. Smile

Sad jasnije? Very Happy



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan