[ Príspevkov: 4 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Pointre v Cecku..

Registrovaný: 18.03.07
Prihlásený: 02.06.13
Príspevky: 264
Témy: 82 | 82
NapísalOffline : 26.01.2012 13:42 | Pointre v Cecku..

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


Offline

Skúsený užívateľ
Skúsený užívateľ
Pointre v Cecku..

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 26.01.2012 16:28 | Pointre v Cecku..

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.


Offline

Užívateľ
Užívateľ
Pointre v Cecku..

Registrovaný: 18.03.07
Prihlásený: 02.06.13
Príspevky: 264
Témy: 82 | 82
Napísal autor témyOffline : 26.01.2012 20:42 | Pointre v Cecku..

vysvetlil si to poekne.. diki
dufam ze tu skusku dam..:)


Offline

Skúsený užívateľ
Skúsený užívateľ
Pointre v Cecku..

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 26.01.2012 21:01 | Pointre v Cecku..

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.


 [ Príspevkov: 4 ] 


Pointre v Cecku..



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

zaciatocnicky problem - C (hodnoty a pointre)

v Backend

7

511

24.01.2012 9:49

BX

V tomto fóre nie sú ďalšie neprečítané témy.

Ovladanie v Cecku

v Backend

0

481

04.05.2011 20:25

mack0

V tomto fóre nie sú ďalšie neprečítané témy.

SVG vykreslovanie v cecku

v Backend

12

849

19.06.2011 17:52

ice-g

V tomto fóre nie sú ďalšie neprečítané témy.

Hľadám programátora v Céčku, stačia aj začiatočnícke schopnosti

v Kôš

1

197

09.11.2016 0:20

JanoF

V tomto fóre nie sú ďalšie neprečítané témy.

Potrebujem spravit maly program v cecku/delphi/jave - odmena

v Ponuka a dopyt práce

0

1296

16.09.2007 13:36

Vriasdjorl



© 2005 - 2026 PCforum, edited by JanoF