70 likes | 234 Vues
Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita. Gymnázium prof. Jana Patočky Jindřišská 36 110 00 Praha 1 www.gpjp.cz/projekty/soucasny-svet geu@gpjp.cz www.esfcr.cz
E N D
Současný světProjekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámciOperačního programu Praha adaptabilita Gymnázium prof. Jana Patočky Jindřišská 36 110 00 Praha 1 www.gpjp.cz/projekty/soucasny-svet geu@gpjp.cz www.esfcr.cz „Praha & EU: Investujeme do vaší budoucnosti“
Jazyk CPointery a funkce Ve většině programovacích jazyků je možno parametry procedury nebo funkce možno volat dvojím způsobem: • hodnotou: jako skutečný parametr se předává hodnota (obsah paměťového místa). To znamená, že uvnitř funkce není možnost toto paměťové místo nijak modifikovat. • odkazem: jako skutečný parametr se předává adresa paměťového místa. Uvnitř funkce je možno s tímto paměťovým místem pracovat.
Jazyk CPointery a funkce Jazyk C: • nezná procedury, pouze funkce • neumožňuje jiné předání parametrů než hodnotou Takže pokud potřebuji předat jako parametr funkce odkaz na paměťové místo (třeba proto, abych mohl s tímto paměťovým místem pracovat ve funkci a výsledek použít i po návratu z funkce), nezbývá než použít pointer.
Jazyk CPointery a funkce • K čemu mi to bude dobré: • třeba tam, kde chci, aby funkce vracela více než jednu hodnotu: • int pocpol , iprom1 , iprom2 ; • char text[20]; • pocpol=scanf("%d %d",&iprom1,&iprom2); • pocpol=scanf("%s",text); • /* nazev pole bez indexu je automaticky pointer, takze nepisu operator reference */ • Funkce scanf vrací jako funkční hodnotu počet načtených položek (zde v 1. případě 2, ve druhém 1) a současně do pole text načte znaky z klávesnice. • Celé je to tak trochu podvod: ve skutečnosti se do funkce předá hodnota pointeru na proměnnou text. Proměnná text je definovaná v nadřízeném programu, je tedy dostupná i po opuštění funkce. Pointer se v tomto případě po opuštění funkce ztratí.
Jazyk CPointery a funkce Příklad: funkce, která vymění obsah dvou proměnných void vymen (int *p_x, int *p_y) { int pom; pom = *p_x; *p_x = *p_y; *p_y = pom; } a její volání: int i = 5 , j = 11 ; vymen (&i, &j) ;
Jazyk CPointery a funkce Pointerů se bohatě využívá například ve funkcích, které pracují se znakovými řetězci; zde je obvykle nutno pracovat uvnitř funkce s více řetězci najednou, takže předání jejich adres pointery je nejlepší řešení. Příklady nejpoužívanějších funkcí pro práci s řetězci: • pro správnou funkci je nutno připojit hlavičkový soubor: #include <string.h> - protože jméno znakového řetězce je samo o sobě pointer, není nutno psát při volání funkce referenci “&” Všechny funkce jsou typu „pointer“, tzn. vracejí jako funkční hodnotu pointer na první znak řetězce s1. Příklad volání: char text1[50], text2[50], *p_navr ; p_navr=strcpy(text1,text2) ;
Jazyk CPointery a funkce Nejpoužívanější znakové funkce: (zde uvedena definice funkčního prototypu): char *strcpy (char *s1 , char *s2) ; kopírování řetězce s2 do s1 char *strcat (char *s1, char *s2) ; spojení řetězců: připojí s2 k s1 char *strchr (char *s1, char c); hledání znaku C v řetězci s1; pokud se najde, vrátí pointer na první výskyt, jinak hodnotu NULL char *strstr (char *s1, char *s2); hledání řetězce s2 v řetězci s1; pokud se najde, vrátí pointer na první výskyt, jinak hodnotu NULL