přejít na obsah přejít na navigaci

Linux E X P R E S, Programovanie v jazyku C++: Pointery – úvod (1)

Programovanie v jazyku C++: Pointery – úvod (1)

cplusplus.png

Tento článok slúži ako úvod k problematike pointerov. Základom pre pochopenie využitia pointerov je názorný problém, ktorý je riešený v článku.


Platnosť dosahu premennej

Aby sme sa dostali k pointerom, ukážeme si program, ktorý má takú menšiu vadu na kráse. Práve efektívnym riešením problému v programe môže byť využitie pointeru.

#include <iostream>
using namespace std;

void scitaj(int cislo)
{
    cislo += 10;
}

void odcitaj(int cislo)
{
    cislo -= 5;
}

void vynasob(int cislo)
{
    cislo *= 2;
}

void vydel(int cislo)
{
    cislo /= 2;
}

int main()
{
    int cislo = 7;
    scitaj(cislo);
    odcitaj(cislo);
    vynasob(cislo);
    vydel(cislo);
    cout << "Vysledok: "<<cislo<<"\n";
    return 0;
}

Cieľom programu je po poradí matematickými operáciami spracovať premennú s hodnotu 7. Výsledok, ktorý sme z programu získali je zlý. Kde nastala chyba? Všimnite si, že hodnota premennej cislo a výsledok je rovnaký. Ani jedna z operácii, ktoré sú definované vo funkciách, neovplyvnila premennú cislo. Je to kvôli tomu, že premenná cislo vo funkcii už nemá nič spoločné s pôvodnou premennou definovanej v hlavnej funkcii main. Takže nech sa stane čokoľvek s premennou cislo vo funkcii, nemá žiadny vplyv na pôvodnú premennú, z ktorej vznikla skopírovaním. Jedným z riešení môže byť využitie návratovej hodnoty funkcie.

#include <iostream>
using namespace std;

int scitaj(int cislo)
{
    cislo += 10;
    return cislo;
}

int odcitaj(int cislo)
{
    cislo -= 5;
    return cislo;
}

int vynasob(int cislo)
{
    cislo *= 2;
    return cislo;
}

int vydel(int cislo)
{
    cislo /= 2;
    return cislo;
}

int main()
{
    int cislo = 7;
    cislo = scitaj(cislo);
    cislo = odcitaj(cislo);
    cislo = vynasob(cislo);
    cislo = vydel(cislo);
    cout << "Vysledok: "<<cislo<<"\n";
    return 0;
}

Dopracovali sme sa k správnemu výsledku. Čo si môžeme všimnúť, že stále priraďujeme novú hodnotu premennej cislo. Predstavte si teraz, že máte tisícky premenných a každá z nich bude mať desiatky priradení hodnôt. To by bolo číre zúfalstvo sa orientovať v takomto kóde. Ale nezúfajte, na pomoc prichádzajú pointery, ktoré nás zbavia úmornej práce s priradeniami premenných.

Čo je pointer?

Pointer nie je nič iné, len premenná uchovávajúca adresu inej premennej. Pozrime sa najprv, ako taká adresa premennej vyzerá.

#include <iostream>
using namespace std;

int main()
{
    int cislo1 = 4;
    int cislo2 = 10;
    int cislo3 = 25;
    cout << "Hodnota premennej cislo1 je: " << cislo1 << " a jej adresa je: " << &cislo1 << "\n";
    cout << "Hodnota premennej cislo2 je: " << cislo2 << " a jej adresa je: " << &cislo2 << "\n";
    cout << "Hodnota premennej cislo3 je: " << cislo3 << " a jej adresa je: " << &cislo3 << "\n";
    return 0;
}

Výsledok je nasledovný:

Hodnota premennej cislo1 je: 4 a jej adresa je: 0x6dfefc
Hodnota premennej cislo2 je: 10 a jej adresa je: 0x6dfef8
Hodnota premennej cislo3 je: 25 a jej adresa je: 0x6dfef4

Zisťujeme, že adresa premennej pozostáva z identifikátora, ktorý určuje kde sa nachádza premenná v pamätí. Avšak ako zabezpečiť, aby premenná v nejakej funkcii mala priamy vplyv na pôvodnú premennú, z ktorej ako kópia vznikla? Skopírovaním adresy jednej premennej do druhej? To je vylúčené. Nemôžu byť uložené dve premenné na tom istom mieste v pamätí. Čo tak ale vytvoriť odkaz tvorený adresou nejakej premennej a na túto premennú odkazovať? A to je základný princíp pointeru.

Skúsme sa pozrieť na implementáciu nášho problému využitím pointerov.

#include <iostream>
using namespace std;

void scitaj(int *cislo)
{
    *cislo += 10;
}

void odcitaj(int *cislo)
{
    *cislo -= 5;
}

void vynasob(int *cislo)
{
    *cislo *= 2;
}

void vydel(int *cislo)
{
    *cislo /= 2;
}

int main()
{
    int cislo = 7;
    scitaj(&cislo);
    odcitaj(&cislo);
    vynasob(&cislo);
    vydel(&cislo);
    cout << "Vysledok: "<<cislo<<"\n";
    return 0;
}

Funkcie v našom programe získavajú ako parameter nie skopírovanú premennú, ale odkaz na ňu. Tak ako máte na pracovnej ploche monitoru odkaz na obľúbenú hru, tak pointer zaisťuje rýchly prístup k premennej. Preto tak môžeme ľahko manipulovať s premennou vo funkciách a práve tu je pointer veľmi využívaným riešením.

V ďalšom dieli sa dozviete, čo znamená znak * a ukážeme si aj nejaké zaujímavé príklady na pointery.

Nahoru

Příspěvky

Programovanie v jazyku C++: Pointery – úvod (1)
James Bond 11. 10. 2018, 18:20:35
Odpovědět  Odkaz 
Proboha, to fakt nemáte v arzenálu někoho jiného než toho neonacistu Boldižára? Vám je jedno že vám dělá ostudu? Proč mu tady furt vydáváte články?
Petr Valach Re: Programovanie v jazyku C++: Pointery – úvod (1)
Petr Valach 11. 10. 2018, 19:39:53
Odpovědět  Odkaz 
No jo, Eda Boldižár, věčné téma :). Co k tomu říct? :) Tak předně nesouhlasím, že by byl fáša. Je v zajetí záměrně šířených hoaxů a propagandy, samozřejmě má blíž k radikálním myšlenkám, ale nemyslím, že by byl vyloženě neonacista. Co se ostudy týče, nemyslím, že je to až tak horké :) Pokud tak nečiní jménem LinuxExpresu, tak je to asi v pohodě. Ale nevím, jeho obsah nesleduju, popravdě pro mě představuje zabitý čas, takže nemohu tolik soudit :).

Eduard Boldižár jako redaktor tak trochu pět roků rostl pod mým vedením. Pokud máte možnost sledovat jeho články (nejen zde), jistě mi dáte za pravdu, že se docela zlepšil :). A věřím, že při čtení jeho aktuálních článků by ho nikdo neztotožnil s jeho prvotinami. Takže udělal velkou cestu kupředu, nu a třeba ho někdy přestane bavit sdílet hoaxy :).

Připomínám, že píšu jen svůj názor, nejsem bossem této redakce :).
Eduard Boldižár Re: Programovanie v jazyku C++: Pointery – úvod (1)
Eduard Boldižár 11. 10. 2018, 21:39:25
Odpovědět  Odkaz 
James Bond, dokáž že som nacek :) ja sám som sa postavil proti kotlebovcom a bolo mi vyhrážané smrťou. Môžeš si prečítať moje reálne príspevky proti ním ;) https://www.facebook.com/groups/328865690526573/search/?query=eduard%20boldi%C5%BE%C3%A1r

PS: nesúhlasiť s neriadenou imigráciou a ľavičiarskymi výmyslami ako gender a násilný feminizmus ešte neznamená že som nacista, to si asi mýliš liberálno-konzervatívné názory s pravicovo extremistickými. Tak snáď nabudúce to už odlíšiš ;)

PS2: prosím o zmazanie tohto vlákna, pretože nemá nič spoločné s IT a snáď sa i James Bond naučí, o čom sa na IT webe diskutuje ;)
Petr Valach Re: Programovanie v jazyku C++: Pointery – úvod (1)
Petr Valach 12. 10. 2018, 19:26:25
Odpovědět  Odkaz 
Nicméně, abych byl spravedlivý, fakt je ten, že nikdo Eduarda nenutil, aby sdílel hoaxy na úrovni Sputniku. Nikdo ho nenutil do prezentace silně kontroverzního obsahu. A je faktem, že právě této nesmyslné činnosti dával roky přednost před třeba psaním článků pro LinuxExpres nebo i mou redakci, kam jsem ho přivedl. Takže ano, spojitost tohoto kontroverzního obsahu s LinuxEXPRES může být kontraproduktivní, ale to už není otázka na mě, ale vedení. Z mé redakce pod vlivem záměrně šířených lží utekl, čili ani v tomto ohledu to není můj problém.

A jinak souhlasím, že by toto vlákno mohlo být smazáno, nepatří sem. Na stranu druhou například vůči mně nikdy za těch deset let podobná námitka vznesena nebyla, protože se zkrátka ve svém volnu věnuju užitečnějším činnostem, a především hledím na to, abych nedělal ostudu. Sobě a těm, kteří se mnou spojili své jméno.
Eduard Boldižár Re: Re: Programovanie v jazyku C++: Pointery – úvod (1)
Eduard Boldižár 12. 10. 2018, 19:43:05
Odpovědět  Odkaz 
Valachu, čo si sa zle vyspal alebo čo? Alebo chceš aby sme začali teraz riešiť tomu, čo si sa ty venoval vo svojom voľnom čase a ako si komunikoval s mládežou v redakcii, ty ktorý má „papiere od psychológa na prácu s mládežou“? :D :P

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz