Kolega nike992, nisi glup nego samo treba vremena da se ovo prezvace, ne moze nista na brzaka da se savlada.
Nisam bas strucan za objasnjavnje ali cu pokusati da ukazem na neke najbitnije stvari koje moras znati pa ce ti posle biti lakse da razumes neke stvari.
Dakle imas tipove promenjljivih:
char slovo;
char* pokazivac;
char oznacava tip podatka koji ce da drzi, u ovom slucaju to je jedno slovo. slovo je samo ime koje dajes promenjljivoj.
char* oznacava isto tip podatka, u ovom slucaju je pokazivac i on "pokazuje" na niz slova.
E sad da se bacimo malo na memoriju. Ovo ti je veoma bitno da razumes!
Prvo da napomenem da sam ja ucio samo iz knjiga i tutorijala koje su na engleskom tako da ne znam neke izraze koje koriste na srpskom.
Memorija koju program koristi je podeljena na vise "ogranaka". Spomenucu samo 2 najbitnijestavke, a to su stek (stack) i hip (heap).
Svaka od ovih stavki ima svoje prednosti a i mane, ali necemo ulaziti u detalje jer nije ni mnogo bitno kad se pocinje sa programirajem.
Memoriju mozes da zamislis kao celije (pogledaj sliku). Svaka celija ima svoju adresu odnosno broj koji je obicno u hexadecimalnoj formi (crveno) i vrednost koja se nalazi na toj adresi (zeleno).
Znaci ako ti je lakse mozes isto mozes da zamislis kao telefonski imenik, brojevi telefona oznacavaju adrese.
E sad recimo imamo ovaj izraz:
char* pokz = "Nike";
Rezervisace se mesto na steku (stack) za pokazivac "pokz" i niz slova na koji pokazuje.
Znaci pokazivac ima svoju adresu (0x5a sa slike) i ona se dobija sa ovim izrazom:
&pkz
ispisivanje u konzoli:
printf("%d", &pkz);
i njegova vrednost koju drzi je adresa (0x01 sa slike) na koju "pokazuje":
pkz
ispisivanje u konzoli:
printf("%d", pkz);
i vrednost na toj adresi (1 slovo sa ovim izrazom, N sa slike):
*pkz
printf("%c", *pkz);
Za listu parametara printf funkcije pogledaj http://www.cplusplus.com/reference/clibrary/cstdio/printf/
E sad da se upoznamo sa nizovima koji su slicni pokazivacima.
char niz[5];
char - tip podatka
niz - ime
5 - broj elemenata koje moze da drzi
Rezervisan je prostor za niz od 5 slova na steku (stack) ali im nije dodeljena vrednost.
Znaci mozes u istoj liniji da popunis vrednosti za svaku "celiju":
char niz[5] = { 'N', 'i', 'k', 'e', '\0' };
//ili ovako stim da ce kompajler automatski odrediti duzinu niza
char niz[] = { 'N', 'i', 'k', 'e', '\0' };
...
// ili se propusta nekoj funkciji da ona dodeli vrednosti, kao recimo scanf
scanf("%s", niz);
Obrati paznju da smo "terminisali" niz sa '\0', ovaj simbol sluzi da bi neke funkcije koje pozivas znale gde je kraj niza.
Za razliku od one deklaracije ova automatski apenduje '\0' na kraju:
char niz[5] = "Nike";// Nike + \0
// ili
char niz[] = "Nike";// Nike + \0
Na tebi je izbor sta ti je lakse.
Stek je relativno mali, mislim da je default oko 1 mb u Visal Studiju, i uglavnom sluzi za male alokacije prostora kao sto su lokalne promenjljive, privremene pr., u rekurzivnim funkcijama...itd
Mislim sasvim je dovoljan za neke sitnije vezbice.
Heap omogucava dosta veci prostor a prostor se rezervise ovako:
char* pkz;
pkz = (char*)malloc(20); // rezervisan prostor od 20 bajta, ali nisu dodeljene vrednosti u celijama
//ili u istoj liniji
char* pkz = (char*)malloc(20); // rezervisan prostor od 20 bajta, ali nisu dodeljene vrednosti u celijama
...
//i sad koristis taj prostor, recimo scanf
scanf("%s", pkz);
...
// za razliku od steka na kraju moras osloboditi tu memoriju koju si alocirao na hipu (heap)
free(pkz);
Funkcija malloc http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/
Funkcija free http://www.cplusplus.com/reference/clibrary/cstdlib/free/
Znaci rezervisan je prostor na steku (stack) za pokazivac "pkz" i 20 bajta na hipu (heap), a vrednost pokazivaca "pkz" je adresa na prostoru koji smo rezervisali na hipu.
Primeri deklaracija pokazivaca, sta ti god odgovara ili sta ti je vise citljivije:
char* p1, *p2, *p3;
//je isto kao
char* p1;
char* p2;
char* p3;
E sad za tvoj primer zadatka islo bi nesto ovako:
...
char* tacanOdgovor = "madrid";
char* odgovor = (char*)malloc(20);
printf("Koji je glavni grad Spanije?\n");
scanf("%s", odgovor);
int rezlutatFunkcije = strcmp(odgovor, tacanOdgovor);
if(0 == rezlutatFunkcije)
{
printf("Tacan odgovor!");
}
else
{
printf("Netacan odgovor!");
}
free(odgovor);
...
Funkcija strcmp http://www.cplusplus.com/reference/clibrary/cstring/strcmp/
Ima dosta detalja koje sam preskocio ali mislim da je dovoljno za pocetak.
Ako ti nesto nije bas jasno slobodno pitaj.
|