Práce s pointrama (ukazatelema) je v Céčku docela významná - obzvlášť, když pracuješ s textama. Taktéž předávání proměnných (nikoliv hodnot) do funkcí se provádí pomocí pointrů.
Ukazatele slouží k tomu, že ukazují na nějaké místo v paměti. S ukazateli se takto (*ij=222) pracuje pouze tehdy, že vytvoříš nějakou proměnnou:
ij=(int*)malloc(sizeof(int);
Pak ukazatel ij ukazuje na místo *ij, kde je alokované místo pro int.
Používá se například při předávání parametr funkcím, pokud chceš, aby funkce změnila hodnotu nějaké proměnné. Práce s řetězci je vlastně jenom práce s pointry.
Jaký je rozdíl mezi těmito funkcemi, jejich voláním a návratovými hodnotami :
[code]int cislo1, cislo2;
prehod cisla(cislo1, cislo2);
void prehod cisla(int A, int B)
{
int pomocna;
pomocna=A;
A=B;
B=pomocna;
}
[/code]
[code]int cislo1, cislo2;
prehod cisla(&cislo1, &cislo2);
void prehod cisla(int *A, int *B)
{
int pomocna;
pomocna=*A;
*A=*B;
*B=pomocna;
}
[/code]
V prvním případě předáváš funkci číslo - tedy hodnotu proměnných cislo1 a cislo2. Funkce je sice v lokálních proměnných A a B přehodí, ale vlastně navenek neudělá vůbec nic.
Ve druhém případě předáš funkci adresy proměnných cislo1 a cislo2. Funkce převezme jejich adresy do lokálních pointrů *A a *B. Hodnotu (obsah) z adresy A přepíše do pomocné proměnné pomocna, hodnotu s adresy B přiřadí hodnotě na adrese A a pomocnou proměnnou uloží na adresu B. Tím, že funkce dostala jako parametr adresu proměnné a nikoliv hodnotu, tak de-facto pracovala s proměnnými cislo1 a cislo2. Jinýmu slovy - skutěčně tyto hodnoty přehodila.
Nezapomeň, že pokud vytvoříš pointer, tak vytvoříš POUZE ukazatel na nějaké paměťové místo. Musíš pro hodnotu proměnné vytvořit a to buď tím, že alokuješ odpovídající paměť nebo tím, že ukážeš na místo, kde nějaké poměnná je a pomocí tohoto ukazatele s ní pracuješ. Tak, jak jsi to napsal je to špatně. Tuhle deklaraci
int *ij=111;
některé překladače ani nezkompilují, protože je špatně. Nelze přiřadit (int *)=(int);
Doporučuju Ti vyhledat si pojem “Práce s pointry” a prostudovat si to. Práce s nimi není až tak složitá, jak se na první pohled zdá. Jak říkával náš učitel C - jsou mocné, ale také nebezpečné. A to z toho důvodu, že když jsi neopatrný, můžeš sahnout prakticky kamkoliv do dat a nadělat si pěknou paseku.