Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
misurka Forumaš(ica)

Pridružen/a: 08. 03. 2008. (18:52:46) Postovi: (10)16
|
Postano: 21:35 ned, 9. 3. 2008 Naslov: Pokazivači, polje kao argument funkcije |
|
|
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] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 22:57 ned, 9. 3. 2008 Naslov: |
|
|
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 
|
|
[Vrh] |
|
misurka Forumaš(ica)

Pridružen/a: 08. 03. 2008. (18:52:46) Postovi: (10)16
|
Postano: 23:16 ned, 9. 3. 2008 Naslov: |
|
|
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] |
|
misurka Forumaš(ica)

Pridružen/a: 08. 03. 2008. (18:52:46) Postovi: (10)16
|
Postano: 23:20 ned, 9. 3. 2008 Naslov: |
|
|
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] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 23:26 ned, 9. 3. 2008 Naslov: |
|
|
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 
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 1:14 pon, 10. 3. 2008 Naslov: Re: Pokazivači, polje kao argument funkcije |
|
|
[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] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
Postano: 1:39 pon, 10. 3. 2008 Naslov: |
|
|
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] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 2:22 pon, 10. 3. 2008 Naslov: |
|
|
[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] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
Postano: 2:51 pon, 10. 3. 2008 Naslov: |
|
|
[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] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 12:27 uto, 11. 3. 2008 Naslov: |
|
|
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.
_________________ "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 
|
|
[Vrh] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
Postano: 13:32 uto, 11. 3. 2008 Naslov: |
|
|
[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.  |
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] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
misurka Forumaš(ica)

Pridružen/a: 08. 03. 2008. (18:52:46) Postovi: (10)16
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
Postano: 21:16 uto, 8. 4. 2008 Naslov: |
|
|
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] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 22:01 uto, 8. 4. 2008 Naslov: |
|
|
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? Preko onog a u funkciji mozes mijenjati sve elemente niza (jer je a[i] isto sto i *(a+i)).
Ako zelis mijenjati niz, a ne njegove elemente (pomalo nespretno receno), trebaju ti dinamicki nizovi. 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. 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).
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. Zato su svi brojevi u drugom retku ovog zadnjeg programa jednaki.
Sad jasnije?
_________________ 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. 
|
|
[Vrh] |
|
|