Citat:
Jordan90:
1. Zasto se kod deklaracije neke char promenljive stavlja *?????? Konkretno u skripti od 8.4 autor stalno pise char *text. Jel moze neko da mi objasni?(Pokusao sam bez toga i ne funkcionise program)
Zvezdica označava da je u pitanju pokazivač (pointer)
Pokazivači sadrže adrese promenljivih. Evo ti jedan primer
Code:
int a; //deklaracija neke promenljive a
int *b; //deklaracija pokazivača b
b = &a; //pokazivač b dobija vrednost adrese od a (&a se čita "adresa od a")
*b = 5; //ovo znači - pročitaj vrednost pokazivača b (u ovom slučaju ta vrednost je adresa promenljive a)
// zatim tu vrednost koristi kao adresu na koju ćeš da upišeš broj 5
// to znači da je na adresu od promenljive a upisan broj 5, odnosno a = 5
Teško je početnicima da skapiraju pokazivače ali su veoma korisni, za funkcije, što tebe sada i buni
Ako na ovo misliš
int MalaSlova(char *text);
To je funkcija čiji je ulazni argument pokazivač tipa char. Ne znam koliko dobro si upoznat sa funkcijama, ili sa stringovima. Hajde pokušaću na jednom primeru da ti objasnim, ako uspem, nisam ni ja neki pro
char tekst[10]
Ovo je deklaracija niza čiji su elementi tipa char, odnosno slova, znakovi, bilo šta iz ASCII tabele. Takav niz se zove string.
Karakterima u ovom nizu se pristupa preko indeksa. Prvo slovo je tekst[0], drugo slovo je tekst[1] itd.
Samo naziv niza bez indeksa je POKAZIVAČ koji sadrži adresu prvog slova u tom nizu.
Zato funkcije koje za argumente primaju stringove se definišu kao pokazivači. Znači imamo ovu funkciju
int MalaSlova(char *text);
Hoćemo kad je pozivamo da ona proveri da li string sadrži mala slova. Ako nam se string zove tekst123, funkciju ćemo pozvati ovako:
MalaSlova(tekst123);
Na taj način smo funkciji prosledili ADRESU PRVOG ELEMENTA NIZA (adresa u memoriji računara na kojoj se nalazi prvo slovo stringa), pošto smo rekli da je string bez indeksa zapravo pokazivač. Funkcija dobija adresu na kojoj se nalazi prvi element niza (prvo slovo u stringu) i dalje radi svoje.
To je zato što je string zapravo niz slova koji se završava NULL znakom ili '\0'. Znači mi funkciji ne dajemo sva slova, nego joj dajemo adresu od koje će da krene da čita, i ona će čitati dok ne naiđe na taj nul znak
Aj da pokušam još malo bolje da objasnim
Kada definišeš neki niz, recimo char tekst123[5], on dobija svoju adresu u memoriji, koja je recimo (lupam) 223415 i od te adrese rezerviše naredne 4 adrese (jer smo ga definisali kao niz sa 5 elemenata). Znači prvi element tog niza tekst123[0] se nalazi na adresi 223415. Drugi element tekst123[1] se nalazi na adresi 223416, treći element se nalazi na adresi 223417 itd.
Ako smo deklarisali niz ovako char tekst123 = "abcd", onda će vrednost prvog elementa, odnosno tekst123[0] biti karakter 'a', a vrednost samog niza tekst123 će biti ADRESA, odnosno, na primer broj 223415. Na toj adresi se nalazi slovo 'a'
Iz tog razloga funkcija kao argument treba da primi adresu, da bi znala odakle počinje niz, jer ne možeš funkciji dati sva slova, nego joj kažeš koja je adresa prvog slova, i onda od te adrese nastavi da čita dok ne naiđe na '\0'
Da smo argument funkcije definisali kao char bez zvezdice, odnosno int MalaSlova(char text), argument bi bio jedan karakter, i kad bismo pozvali funkciju ovako: MalaSlova(tekst123), argument funkcije (char text) bi primio adresu stringa tekst123 (recimo 223415) i to pretvorio u ASCII vrednost, što ne bi uspeo i ko zna šta bi se desilo...
Citat:
2. Kod funkcije malloc,nije mi jasno.... ja na samom pocetku definisem text = malloc(sizeof(char)*15) i ubacim neki string od 10 znakova i to je ok,a kad promenim
text = malloc(sizeof(char)*5) opet normalno ispisuje string od 10 znakova.... U cemu je onda poenta ako se nista nije izmenilo?? I gde da proverim velicinu programa?
Zaleteo si se, ovo je već advanced, prvo doooobro nauči pokazivače i nizove
String će se ispisivati dok ne naiđe na nul karakter '\0'. Znači ispisuje se znak po znak dok se ne dođe do tog praznog znaka. Iako je memorijski prostor skroz popunjen karakterima, ako nema '\0' na kraju, nastaviće da čita vrednost sledeće lokacije i tako sve dok ne dođe do tog \0 karaktera
Time što si napisao printf("%s", tekst), ili puts(tekst), time si ti programu rekao "kreni da čitaš od adrese tekst i ispisuj karakter po karakter dok ne dođeš do karaktera '\0' "
Nadam se da si bar kolko-tolko razumeo nešto od ovoga što sam napisao, jer sam se vala pomučio :D znam kako je, i ja sam student
Dakle da rezimiramo. Da bi programu rekao na koji string misliš, moraš mu dati adresu na kojoj se nalazi prvo slovo u stringu, i on će čitati dok ne naiđe na '\0'
(ako sam pogrešio negde, neka me neko ispravi)
edit: Možeš zapravo i da definišeš funkciju kao int MalaSlova(char text[]). Možeš se kroz string kretati indeksno (text[0], text[1], text[2]...) ili adresno (text, text+1, text+2...) nego nisam napisao da te ne bunim
[Ovu poruku je menjao tuks dana 12.05.2012. u 02:09 GMT+1]