abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 18:11 | IT novinky

    Dnes a zítra probíhá vývojářská konference Google I/O 2025. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).

    Ladislav Hagara | Komentářů: 0
    dnes 15:22 | Komunita

    V Bostonu probíhá konference Red Hat Summit 2025. Vybrané přednášky lze sledovat na YouTube. Dění lze sledovat na síti 𝕏 (#RHSummit).

    Ladislav Hagara | Komentářů: 0
    dnes 15:00 | Nová verze

    Společnost Red Hat oficiálně oznámila vydání Red Hat Enterprise Linuxu 10. Vedle nových vlastností přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 1
    dnes 12:22 | Pozvánky

    Tuto sobotu 24. května se koná historicky první komunitní den projektu Home Assistant. Zváni jsou všichni příznivci, nadšenci a uživatelé tohoto projektu. Pro účast je potřebná registrace. Odkazy na akce v Praze a v Bratislavě.

    jose17 | Komentářů: 0
    dnes 04:44 | IT novinky

    Troy Hunt představil Have I Been Pwned 2.0, tj. nový vylepšený web služby, kde si uživatelé mohou zkontrolovat, zda se jejich hesla a osobní údaje neobjevili v únicích dat a případně se nechat na další úniky upozorňovat.

    Ladislav Hagara | Komentářů: 13
    včera 23:22 | Zajímavý software

    Microsoft představil open source textový editor Edit bežící v terminálu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 7
    včera 22:22 | Zajímavý software

    V Seattlu a také online probíhá konference Microsoft Build 2025. Microsoft představuje své novinky. Windows Subsystem for Linux je nově open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

    Ladislav Hagara | Komentářů: 0
    včera 13:11 | Zajímavý článek

    Z příspěvku Turris Sentinel – co přinesl rok 2024 na blogu CZ.NIC: "Za poslední rok (únor 2024 – únor 2025) jsme zachytili 8,3 miliardy incidentů a to z 232 zemí a z jejich závislých území. Tyto útoky přišly od 6,2 milionu útočníků (respektive unikátních adres). SMTP minipot je stále nejlákavější pastí, zhruba 79 % útoků bylo směřováno na tento minipot, 16 % útoků směřovalo na minipot Telnet, 3 % útoků směřovaly na minipot HTTP a 2 % na minipot FTP. Dále jsme zaznamenali 3,2 milionu unikátních hesel a 318 tisíc unikátních loginů, které útočníci zkoušeli."

    Ladislav Hagara | Komentářů: 1
    včera 12:44 | Nová verze

    Byla vydána (Mastodon, 𝕏) nová verze 3.0.4 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    včera 12:33 | Nová verze

    Byla vydána nová stabilní verze 7.4 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 136. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    Jaký je váš oblíbený skriptovací jazyk?
     (60%)
     (23%)
     (9%)
     (2%)
     (0%)
     (0%)
     (6%)
    Celkem 47 hlasů
     Komentářů: 5, poslední dnes 20:57
    Rozcestník

    Ukazatele jako parametry funkcí v jazyce C

    10.11.2010 12:02 | Přečteno: 4225× | programování v C

    Chápu, že třeba ukazatel na znak je proměnná, která neobsahuje přímo určitý znak, nýbrž obsahuje adresu, na které ten určitý znak leží. Může také třeba obsahovat adresu prvního člena pole znaků.

    Dokonce ještě (snad) chápu ukazatele na ukazatele na celé číslo (znak apod.). Používá se třeba v případě dvourozměrných dynamických polí.

    Co ale nemůžu pochopit -- to jsou funkce, jejichž parametrem (parametry) je (jsou) ukazatel (ukazatele). Hlavně by mě velmi zajímalo, jaký je rozdíl mezi těmito konstrukcemi:

    int funkce1(char *ret)
    {
      /* Tuhle funkci snad chápu dobře. Když ji zavolám s určitým
         parametrem, tak se vytvoří nový ukazatel, jehož obsahem
         bude stejná adresa na znak jako byla u parametru. */
    
      /* Můžu si tedy dovolit toto: */
      *ret = 'A';
      
      /* Když budu vědět, že se jedná o pole, tak můžu třeba i toto: */
      *(ret + 1) = 'B';
    
      /* Pokud to chápu úplně dobře, měl by to jít i takhle: */
      ret[0] = 'A';
      ret[1] = 'B';
    
      /* Jelikož se v C předává pouze hodnotou, tak tímto
         ztratíme adresu, kterou jsme pouze převzali z parametru,
         parametr to nijak neovlivní: */
      ret = NULL;
    }
    
    int funkce2(char **ret)
    {
      /* Tak toto nemůžu pochopit. Jedná se o ukazatel na ukazatel na znak
         Tzn. že se bude předávat adresa na ukazatel na znak. */
    }
    

    Byl by někdo hodný a poradil mi, jaký je rozdíl mezi funkcemi funkce1() a funkce2()? Tedy hlavně rozdíl mezi "*ret" a "**ret". Předem děkuju.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Luboš Doležel (Doli) avatar 10.11.2010 12:23 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    char** je ukazatel na char*, takže pokud chcete z char** dostat char, musíte dělat * dvakrát. Ale smyslem char** je změnit někde adresu ukazatele. Typicky jde tedy o výstupní argument, který tam třeba zapíše nově vytvořený buffer.
    10.11.2010 12:33 Begleiter | skóre: 47 | blog: muj_blog | Doma
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    smyslem char** je změnit někde adresu ukazatele

    Pokud chceme, aby se změna obsahu ukzatele (tedy kam ukazuje) projevila i vně funkce (tedy jakoby se předávalo odkazem), tak pracujeme s "**ret" (v hlavičce funkce). Díky!

    Josef Kufner avatar 10.11.2010 22:55 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    A nebo se předává do funkce pole řetězců.
    Hello world ! Segmentation fault (core dumped)
    Luboš Doležel (Doli) avatar 10.11.2010 23:41 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Jo, typická ukázka: funkce main :-)
    10.11.2010 12:45 qiRzT | skóre: 14 | blog: U_Marvina
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Zamysli se nad tím, co do té druhé funkce předáváš - nějakou adresu v paměti. Co je na té adrese? Zase nějaká adresa a na téhle adrese je nějaký char.
    typ     char **     char *     char
    adresa: 2008        2004       2000
    data:   2004    ->  2000    ->  'A'
    
    Rozdíl mezi těma funkcema ve volání může být třeba takový:
    char c = 'A';
    char * cp = &c; /*cp == 2000*/
    char ** cpp  = &cp; /* cpp == 2004*/
    
    /*volani se stejnym vysledkem*/
    funkce1(&c);
    funkce1(cp);
    
    /*volani se stejnym vysledkem*/
    funkce2(&cp);
    funkce2(cpp);
    
    
    pokud navíc:
    int funkce2(char **ret)
    {
     return funkce1(*ret);
    }
    
    
    Tak se to všechno bude chovat stejně.
    Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
    10.11.2010 14:25 Roger
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    char c = 'A';
    char * cp = &c; /*cp == 2000*/
    
    Ty Cckove komentare tomu zrovna nepomahaji :)
    10.11.2010 15:45 qiRzT | skóre: 14 | blog: U_Marvina
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Hmm, měl jsem tam dát apoň mezery. Takle s C++ komentáři to snad je jasné:
    char c = 'A';
    char * cp = &c;        // cp  == 2000
    char ** cpp  = &cp;    // cpp == 2004
    
    Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
    10.11.2010 16:14 Begleiter | skóre: 47 | blog: muj_blog | Doma
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

    Děkuju moc. Už to chápu.

    10.11.2010 12:48 ____ | skóre: 15 | blog: _
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

    Nějak nechápu, co na tom chceš ještě vysvětlit. Připadá mi, že v tom hledáš nějakou magii, která v tom není.

    První funkce přebírá ukazatel na znak, druhá funkce přebírá ukazatel na ukazatel na znak. Možná ti pomůže vysvětlení na anglické Wikipedii. A nebo si to zkus načrtnout na papír.

    Ukazatele se dají obecně indexovat jako pole (dokonce i do mínusu), takže *ret ve funkci1 je skutečně to samé jako ret[0] v téže funkci (jak se tu řešilo nedávno, ret[0] a 0[ret], je defakto *((ret) + (0)), což je zas ekvivalentní k *ret). Rozdíl mezi ukazatelem a polem se ukáže v momentě, kdy se pokusíš zjistit jejich velikost.

    A teď jsem tě možná pomátl dočista. :)

    10.11.2010 16:15 Begleiter | skóre: 47 | blog: muj_blog | Doma
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

    Díky!

    10.11.2010 13:50 CET
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Ano, jazyk C je zrovna jazyk na rozmezi mezi assemblerem/strojakem a vyssim jazykem bez ukazatelu (resp. nahrazenych jinymi konstrukcemi).

    Pokud bys nekdy delal v assembleru, tak bys zjistil, ze je uplne jedno, kolik to ma v C hvezdicek, ale ze je dulezite, jak to interpretujes.

    Prakticky jsou ty hvezdicky jakesi kontroly, co ta promenna obsahuje, takze pokud to blbe pouzijes, tak te bude treba kompiler u prace s char **a varovat, ze s obsahem ukazatele (coz je zase ukazatel) chces pracovat jako s char. Ale fakticky ti to dovoli, stejne jako v assembleru muzes obsah pameti bud vypsat jako znak, nebo to vzit jako adresu a cist neco z te adresy.

    Ve vyssich jazycich pak uz te nezajima, ze "a" ve string a; je vlastne taky ukazatel na znaky (ala char *a), ale pracujes s tim, jakoby sama promenna "a" byla ten string.

    Cili funkce1 bere ukazatel na pole charu, cili na adresu, od ktere zacinaji chary.

    char *a je tedy
    a[1000] -> 'A','B','C','D'...'\0'
    
    Druha funkce2 bere ukazatel na ukazatele na chary, cili od adresy ret mas seznam cisel, ktere udavaji adresy, kde zacinaji jednotlive chary.

    Tady je ale char **a

    a[3000] -> 1000,1200,1400,1600
    1000 -> 'a','a','a','a',...'\0'
    1200 -> 'e','e','e','e',...'\0'
    1400 -> 'c','c','c','c',...'\0'
    
    nebo se pletu?
    10.11.2010 16:18 Begleiter | skóre: 47 | blog: muj_blog | Doma
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

    Super! Moc děkuju.

    10.11.2010 15:17 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    int funkce1(char *ret)
    {
      /* Můžu si tedy dovolit toto: */
      *ret = 'A';
    }
    ne tak uplne. treba volani funkce1("Foobar"); ti neprojde, protoze retezec je s nejvetsi pravdepodobnosti v casti pameti, ktera se neda menit.

    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    10.11.2010 15:24 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Tam vypíše warning, protože "Foobar" je, afaik, const char*.
    Nicméně přeloži to a pak vzniká rizoto SIGSEGV.
    rADOn avatar 10.11.2010 17:00 rADOn | skóre: 44 | blog: bloK | Praha
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    C prekladac to dovoli, protoze se nemeni ukazatel ale pamet na kterou ukazuje. C++ to nedovoli.
    "2^24 comments ought to be enough for anyone" -- CmdrTaco
    10.11.2010 17:27 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Mně to přeložil i g++... ale nevim...
    pavlix avatar 11.11.2010 03:56 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    C prekladac to dovoli, protoze se nemeni ukazatel ale pamet na kterou ukazuje. C++ to nedovoli.
    Takhle použitý const právě naopak znamená, že se *nesmí měnit obsah té paměti.

    * Mnohé překladače pouze varují.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    10.11.2010 16:43 Radek Hladik | skóre: 20
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Upřímně řečeno, tohle je v C jeden z nejdůležitějších momentů (a pro mně i jeden z největších důvodů, proč C nesnáším). Při programování v C se budete velmi často setkávat s konstrukcemi typu adresa pointeru na pointer a pod. A především i s přetypováváním pointerů, tedy funknce může dostat pointer buď na char nebo int (dejme tomu). Pak má jako parametr pointer na void (netypový pointer) a podle potřeby si pointer přetypuje. A pro jistotu se předává ne pointer na void, ale pointer na pointer na void, aby to šlo změnit.

    Ještě lepší je, když se posílá pointer na pointer na void, ten se přetypuje na nějakou uživatelskou struct, tam se očekává polovina věcí už vyplněná, zbytek se nějak v rámcí funkce dopočítá a vše se vrátí jako nový pointer :-) A přidáme si do toho makra, která sice mohou být úžasná, ale zároveň i megaultrahumusná a vznikne dobrý chaos... Například práce s ASN.1 v OpenSSL je naprosto "úžasná". Zavoláte jedno makro (od kterého není pořádný popis v dokumentaci) a ono to udělá asi milión volání funkcí, přetypovávání a já nevím čeho všeho. Definice makra není pořádně k dispozici, protože je nějaká hromadná, či jak se to jmenuje atd...

    Nu, to jsem se ale nechal trochu unést, v principu jsem chtěl říct jen to, že tahle práce s pointery je v C alfou a omegou všeho a je potřeba jí perfektně ovládát... Až pak budete luštit/tvořit konstrukce typu (sc_path_t *) &(env->file_ref), budete to sakra potřebovat...
    10.11.2010 16:50 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Ne všichni píší pod gtk :-D
    (a freetype2 a libavcodec a ... a ... :-()
    Grunt avatar 10.11.2010 17:36 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    No jo, ale vem si, že i přes to, že mplayer polovinu času nedělá nic jiného než že někde přesouvá pointery z libav*, ffmpegu, a jiných obalovacích vrstev jak je rychlý. Dovedeš si představit ho napsaný v něčem jiném? (krom komplet Assembleru…i tak ho tam už není málo). Např. stack některých C++ aplikací, to je fakt dílo. Proti nim je i debugovaní kernelu slabé máslo.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    10.11.2010 18:18 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Jo, to je pravda, mplayer je hodně rychlý.
    Ale třeba takové VLC je taky (z většiny) v C a přitom je děsně pomalý...
    Grunt avatar 10.11.2010 18:27 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Tam je totiž těch obalových vrstev ještě jednou tolik.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    Luboš Doležel (Doli) avatar 10.11.2010 22:04 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Pomalý v čem? :-)
    11.11.2010 01:14 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    V přehrávání.
    Na notebooku s omezeným výpočetním výkonem se to pozná; VLC má o dost níž strop HD videí, které je schopno plynule přehrát...
    David Watzke avatar 11.11.2010 16:18 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    To není pravda obecně, třeba na Intelu když používám VA API, tak mi VLC přijde lepší. Problém MPlayeru je hlavně postupný (mírný) rozjíždění A/V.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    11.11.2010 20:51 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Tím Intelem myslíš grafárnu? Tam už funguje aj h264 Vím že dřív šlo jen mpeg2...
    mirec avatar 11.11.2010 09:30 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Taký ffmpeg je tiež v C a patrí medzi pomerne pomalé dekódery. MPEG4 AVC prehráva o dosť pomalšie než CoreAVC.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    10.11.2010 16:56 Begleiter | skóre: 47 | blog: muj_blog | Doma
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

    Děkuju za názor.

    10.11.2010 16:59 qiRzT | skóre: 14 | blog: U_Marvina
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    A tos ještě zapoměl na pointery na funkce. S těma makrama jsi mi připoměl moje první setkání s tím, jak jsou v Linuxu (tedy kernelu) řešeny objekty, polymorfismus apod. V tom se vyznat, je taky (aspoň zpočátku) pěkná fuška :-)
    Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
    Rezza avatar 10.11.2010 19:03 Rezza | skóre: 25 | blog: rezza | Brno
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    A GLib!
    Grunt avatar 10.11.2010 17:32 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Na to mám jednoduchý trik. Zapnu GDB a mlátím do TABu (umí to něco jako BASH completion) tak dlouho dokuď se tečkama přes struktury a pointery neprobiju až na požadovanou proměnnou. A jako bonus to zahlásí, když je některá proměnná typu void a nejde dereferencovat. Stallman budiž blahořečen.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    11.11.2010 22:51 tom
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Krome *(ret + 1) = 'A' a ret[1] = 'A' muzete psat i 1[ret] = 'A' ;) scitani je totiz komutativni
    11.11.2010 23:34 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    To je sice hezké, ale je to - kromě znepřehlednění programu - k něčemu dobré?
    Gilhad avatar 12.11.2010 01:33 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
    Připravuje nás to psychicky na použití Perlu :)

    (A možná se jednou za čas někde vyskytne nějaká složitější konstrukce, která se tak dá zapsat lépe. A taky má určitý půvab "úplnost" - nevylučovat předem věci, které jsou zdarma, jen pro ně nemám použití zrovna tady a teď, zvláště pokud by to vyloučení něco stálo.)

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.