Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ 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
Príspevok NapísalOffline : 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


Offline

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

Registrovaný: 11.01.09
Prihlásený: 19.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


Offline

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

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

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ý: 19.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


Odpovedať na tému [ Príspevkov: 4 ] 


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 Assembler, C, C++, Pascal, Java

7

432

24.01.2012 9:49

BX Zobrazenie posledných príspevkov

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

v Assembler, C, C++, Pascal, Java

0

413

04.05.2011 20:25

mack0 Zobrazenie posledných príspevkov

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

v Assembler, C, C++, Pascal, Java

12

763

19.06.2011 17:52

ice-g Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Potrebujem spravit maly program v cecku/delphi/jave - odmena

v Ponuka práce

0

1214

16.09.2007 13:36

Vriasdjorl Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra