IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @666
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Zatepliť - Izolácia 2012

EXpresné zateplenie. Rýchlo, kvalitne a s vysokým účinkom. Fúkané min. izolácie. www.thermiss.sk

Neuveriteľne lacná .sk doména

Rýchla registrácia domén za výborné ceny. www.exohosting.sk

Ohrievače vody - Elíz BA

Zásobníkové a prietokové ohrievače vody a ostatný sortiment v širokej ponuke. www.eliz.sk

Myslite s nami ekologicky

Zapojte sa súťaže s Orangeom a vyhrajte zeleň pre vaše mesto či obec! www.orange.sk

BISHOLIN už aj na Slovensku

Unikátny preparát na pohybové ochorenia: reuma, svaly, šľachy ale aj iné problémy www.detoxipan.sk

Pointre v Cecku..

Zaslať odpoveď
AutorSpráva
svejk
Užívateľ
Užívateľ

Založený: 18.03.2007
Príspevky: 251

PríspevokZaslal: Št 26.01.12 14:42Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Št 26.01.12 17:28Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
svejk
Užívateľ
Užívateľ

Založený: 18.03.2007
Príspevky: 251

PríspevokZaslal: Št 26.01.12 21:42Odpovedať s citátomNávrat hore

vysvetlil si to poekne.. diki
dufam ze tu skusku dam..
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 1052

PríspevokZaslal: Št 26.01.12 22:01Odpovedať s citátomNávrat hore

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.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
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.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd