| | |
| Stránka: 1 z 1
| [ Príspevkov: 4 ] | |
Autor | Správa |
---|
Registrovaný: 18.03.07 Prihlásený: 02.06.13 Príspevky: 264 Témy: 82 | Napísal svejk: 26.01.2012 13:42 | |
|
zdravim
mam problem s uplknym pochopenim ukazatelou v cecku. Mame s toho zajtra skusku, tak by ste mi mohli niekto napisat par slov o tom..
mam tu jednoduchy program, ktory nerobi to co by mal..:
Kód: #include <stdio.h> #include <stdlib.h>
void prirad (int*ptr) { int x = 10; ptr = &x; }
int main() { int x = 8; int *ptrint = &x; prirad(&ptrint);
printf("%d", *ptrint);
return 0; }
vysledok by mal byt 10, no ono to mrzne.. kde je problem??
dakujem
|
|
Registrovaný: 11.01.09 Prihlásený: 19.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 26.01.2012 16:28 | |
|
1. chyba:
Funkcia prirad() berie ako parameter premennu typu int*, to znamena smernik na typ int. Ty ale robis nasledovne:
Kód: int *ptrint = &x; prirad( &ptrint ); Premenna ptrint je typu int*. Operand & vracia adresu premennej. Ak spravis &ptrint, dostanes adresu smernika na int, cize typ int**. Funkcia ale ocakva int*. Oprav to nasledovne: Kód: prirad( ptrint ); 2. chyba:Argumenty funkcii sa vo vacsine pripadov predavaju cez zasobnik ( podla pouzitej konvencie, no ako som spomenul, vo vacsine pripadov sa predava cez zasobnik ). To znamena, vo funkcii sa nepracuje s premennou samotnou, ktoru sme vlozili ako argument, ale iba s jej kopiou ( cize v podstate iba s hodnotou tejto premennej ). Ak to prenesieme na nas pripad, po volani: Kód: prirad( ptrint ); funkcii predame premennu ptrint. Funkcia ale bude pracovat iba s jej hodnotou, teda adresou premennej &x ( pre lepsiu ilustraciu, moze to byt cislo napr 0xbffff444 v hexadecimalnej sustave ). Ak uz sme vo funkcii, kde narabame iba s hodnou argumentu, teda s nasou adresou 0xbffff444, nasledovne: Kód: ptr = &x;
vykona to, ze na miesto v zasobniku, kde je ulozeny argument ptr, uloz adresu lokalnej premennej &x, cim sa prepisa povodna hodnota. POZOR, prepise sa ale iba kopia na zasobniku!. Tym padom, ak vyjdeme z funkcie a zavolame printf s *ptrint, vypise sa stale pociatocna hodnota 8, nie 10.
Ak chces pracovat so smernikom spravne, robi sa to takto:
Citácia: *ptr = x;
To znamena, musis zapisovat na adresu, kde smernik ukazuje - pretoze tato adresa je skopirovana aj na zasobniku a ty s nou mozes plnohodnotne pracovat aj vo funkcii.
Zhrnutie:
& - vracia adresu lubovolnej premennej
* - dereferencuje smernik, tzn, mozes citat/zapisovat na adresu, na ktoru ukazuje (najprv hviezdicka, potom nazov premennej -- *nazovPremennej ).
Ak chces pracovat s pointerom ( adresou ), pouzijes iba nazov smernika, teda ho dereferencujes: ptrPremenna = &x;
Ak chces pracovat s hodnotou ulozenou na adrese, kde ukazuje, tak pouzijes tento zapis: *ptrPremenna = 123;
Po tomto zapise sa bude x rovnat 123.
Ak ti stale nieco nie je jasne, kludne sa pytaj, snazil som sa to co najlepsie vysvetlit.
|
|
Registrovaný: 18.03.07 Prihlásený: 02.06.13 Príspevky: 264 Témy: 82 | Napísal autor témy svejk: 26.01.2012 20:42 | |
|
vysvetlil si to poekne.. diki
dufam ze tu skusku dam..
|
|
Registrovaný: 11.01.09 Prihlásený: 19.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 26.01.2012 21:01 | |
|
Jo, tuna som sa zle vyjadril:
Citácia: Ak chces pracovat s pointerom ( adresou ), pouzijes iba nazov smernika, teda ho dereferencujes: ptrPremenna = &x; Plati iba toto: Citácia: Ak chces pracovat s pointerom ( adresou ), pouzijes iba nazov smernika: ptrPremenna = &x;
Takto je to spravne, nakolko operator * sluzi na dereferencovanie.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 4 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| zaciatocnicky problem - C (hodnoty a pointre) v Assembler, C, C++, Pascal, Java | 7 | 432 | 24.01.2012 9:49 BX | | Ovladanie v Cecku v Assembler, C, C++, Pascal, Java | 0 | 413 | 04.05.2011 20:25 mack0 | | SVG vykreslovanie v cecku v Assembler, C, C++, Pascal, Java | 12 | 763 | 19.06.2011 17:52 ice-g | | Potrebujem spravit maly program v cecku/delphi/jave - odmena v Ponuka práce | 0 | 1214 | 16.09.2007 13:36 Vriasdjorl |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|