| Autor | Správa |
svejk
 Užívateľ
 Založený: 18.03.2007 Príspevky: 251
 | Zaslal: Št 26.01.12 14: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 |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Št 26.01.12 17: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:
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:
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:
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:
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. |
| |
   |
 |
svejk
 Užívateľ
 Založený: 18.03.2007 Príspevky: 251
 | Zaslal: Št 26.01.12 21:42 |   |
vysvetlil si to poekne.. diki
dufam ze tu skusku dam.. |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Št 26.01.12 22: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. |
| |
   |
 |
|
Nemôžete pridávať nové témy do tohto fóra. 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. Nemôžete hlasovať v tomto fóre.
|
|