www.amapro.cz & David Bazala [Programování]

Otevře webové stránky AmaPro


Otevře hlavní stránku společnosti AmaPro
Internetové stránky určené pro studenty středních a vysokých odborných škol.


amapro.cz/odkazy Projekt eliminuje vyhledávání klíčových slov na komerčních stránkách a v e-schopech.



Nový projekt AmaPro

 

Volání funkcí s předáním ukazatele

 

Některé funkce se volají tak, že se předá jen ukazatel, resp. jeho logické jméno a překladač již zajistí jeho interpretaci v paměti. Opětovně lze při výstupu předat pouze ukazatel. Ukazatel je zpravidla 4 bajtový  (32bitových PV) a může ukazovat na jiné datové typy a objekty. V našem případě ukazuje na typ char, který v paměti zabírá 1 Bajt a určen je převážně k práci se znakovými řetězci.

 

Konstrukce funkcí s ukazateli:

 

char* Zasobnik;                             

void NaplnZasobnik(char* x)      

     {

     Zasobnik=x;

     }

char* VratZasobnik(void)

     {

     return (char*)Zasobnik;

     }

 

 

Do funkce NaplnZasobnik() vstupuje pouze ukazatel na řetězec charů, který leží někde (zcela nepodstatně) v paměti. Obsah ukazatele vstupujícího do funkce je pomocí rovná se překopírován na fyzickou adresu ukazatele proměnné Zasobník. V podstatě se jedná o překopírování čtyřech Bajtů od adr1 do adr2.

 

Funkce VratZasobnik() vrací pouze ukazatel na řetězec charů někde v paměti. Obsah ukazatele ukazuje na nějaké nepodstatné místo v paměti. V podstatě dojde k překopírování výstupních čtyř Bajtů na adresu funkce či proměnné, která ji vyvolala.

 

 

Obr.1: Ukázka rozpisu paměti při práci s ukazateli

 

Na obr.1 je znázorněn text „Ahoj Pavle, jak se máš?“, který leží jako pole charů v paměti od adresy $A000:1000. Tuto adresu vybral OS a pro programátora není příliš podstatná. Char je jedno Bajtový a proto text se rozloží v paměti až po adresu $A000:10E5, kde leží ukončovací znak /0 pro řetězce. Ukazatel UK1 byl inicializován textovým řetězcem na počáteční adresu textu. Funkce pracující s polem charů respektuje hodnotu 00, jako ukončovací znak. Například ve výpisu textu pomocí <<cout<< se vypíše text jen do prvního znaku /0. Viz obr. Dále inicializujeme nový ukazatel, který zatím ukazoval na neurčité místo v paměti. Ačkoliv fyzická adresa UK2 je jinačí než UK1, obsah je stejný, takže oba ukazatele ukazují na stejné místo v paměti (viz. obr). S ukazatelem je možné provádět matematické operace, jak ukazuje příklad UK+=5, který inkrementuje hodnotu ukazatele o 5 a posune jej dle obr.1. Následný výpis textu je tedy zkrácen, ale končí stále u /0. Pomocí referenčního operátoru lze získat i fyzickou adresu ukazatele. Někdy se také používá.


#pragma hdrstop
#include <iostream.h>
//---------------------------------------------------------------------------
char* Zasobnik;                              //deklarace proměnné jako ukazatele na char
void NaplnZasobnik(char* x)                  //funkce, kam vstupuje ukazatel na char
     {
     cout<<"** x Naplneni **"<<endl;
     cout<<x<<endl;                          //řetězec od adresy, kam ukazuje ukazatel
     cout<<&x<<endl;                         //adresa, kde leží paměť pro ukazatel, který někam ukazuje
     Zasobnik=x;                             //překopírování hodnot obsahů ukazatelů
     }
char* VratZasobnik(void)
     {
     cout<<"** x Vyplneni **"<<endl;
     cout<<Zasobnik<<endl;                   //řetězec od adresy, kam ukazuje ukazatel
     cout<<&Zasobnik<<endl;                  //adresa, kde leží paměť pro ukazatel, který někam ukazuje
     return (char*)Zasobnik;                 //vrací obsah ukazatele
     }
#pragma argsused
int main(int argc, char* argv[])
{
char OutZnaky[30]="Ahoj Pavle, jak se mas?";  //alokace a inicializace pole charů v paměti
cout<<"** OutZnaky Inicial.**"<<endl;
cout<<OutZnaky<<endl;                         //adresa, kde leží paměť pro ukazatel, který někam ukazuje
cout<<&OutZnaky<<endl;                        //řetězec od adresy, kam ukazuje ukazatel
char* InZnaky;                                //alokace paměťového místa pro ukazatele na char
cout<<"** InZnaky Neinicial.**"<<endl;
//cout<<InZnaky<<endl;                        //POZOR, ukazatel má náhodnou hodnotu
//cout<<*InZnaky<<endl;                       //POZOR, ukazatel má náhodnou hodnotu
cout<<&InZnaky<<endl;                         //řetězec od adresy, kam ukazuje ukazatel

NaplnZasobnik(OutZnaky);                      //volání funkce s předáním hodnoty ukazatele
InZnaky=VratZasobnik();                       //volání funkce, která zapisuje na adresu ukazatele ukazovátko

cout<<"** InZnaky Inicial.**"<<endl;
cout<<InZnaky<<endl;                           //adresa, kde leží paměť pro ukazatel, který někam ukazuje
cout<<&InZnaky<<endl;                          //řetězec od adresy, kam ukazuje ukazatel
getchar();
return 0;

Příklad demonstruje použití ukazatele pro volání dvou funkcí. V jednom případě ukazatel do funkce vstupuje a v druhém je předáván jako návratová hodnota. V příkladu jsou vidět možnosti předávání obsahu ukazatele. Prvně je definováno pole charů OutZnaky [], které je inicializováno textem. OutZnaky je vlastně ukazatel na první znak, respektive na adresu, kde je uložen text. Tento text je předán do funkce NaplZasobnik(), kde je předán do nová proměnné Zasobnik typu ukazatel. Po volání funkce VratZasobnik() se vrací obsah ukazatele Zasobnik, kam byla zapsána adresa ukazující na počátek textu. Ukazatel je předán ukazateli InZnaky, který jej pak předán funkci výstupního proudu cout.

 

 


Abecední seznam všech článků Vyhledání pojmů ve článcích




Číslicové počítače
Základní aritmetické operace, logické operace a vztahy mezi nimi.
programovani/cislicove_pocitace
Procesory a mikroprocesory
Obecný úvod do základů mikroprocesorové techniky, architektury počítačů
knihy/mikroprocesory/obsah_mikro2.php
Popis HTML formátu
Velikost textu, barva textu, rozvržení stránky, obrázky, barva pozadí se zapisuje pomocí HTML příkazů.
stranky/html_tag
Databáze obrázků
Malé a velké obrázky, podlkady, tlačítka, okrasné čáry a pod.
datove_zdroje/obrazky
Popis jazaka C
Průvodce příkazy programovacího jazyka C.
programovani/jazyk_c
Mikroprocesory IV.
Varianty návrhu číslicových řídících systémů realizovaných jako sekvenční obvody.
programovani/procesory_4
Objektové programování c++
Jazyk C, Objektové programování c++
internet/katalog_programovani_c
Animované obrázky
Animované gify a malé obrázky pro všeobecné využití.
datove_zdroje/animace
OnLine televize
Seznam světových on line televizních vysílání
internet/katalog_internetove_televize
Otevře stránky Fulltextové vyhledávání na celém serveru
Digitalizované odborné knihy
Velká encyklopedie pojmů a zkratek
Česko - anglicko - německý technický slovník
Klasický katalog firem, služeb a stránek
OnLine překladač  vět a textů (nepoužívá Google)
Stránky pro chvíle oddechu od studia, relaxace
Katalog českých firem dle technologií
Internetový odkazník
Otevře hlavní stranu pro oddíl programování




 Wikipedie   Seznam stránek   Kapitoly témat   Významné servery   Klíčová slova 








Otevře hlavní stranu společnosti AmaPro

Všechna práva vyhrazena. Určeno jen pro osobní využití. Bez předchozího písemného souhlasu správce www.amapro.cz je zakázána jakákoli další publikace, přetištění nebo distribuce jakéhokoli materiálu nebo části materiálu zveřejněného na www.amapro.cz a to včetně šíření prostřednictvím elektronické pošty. Články, jejichž přímým autorem není amapro.cz lze publikovat pouze se souhlasem jejich majitelů či administrátoru příslušného webu.