Portál AbcLinuxu, 7. května 2025 14:33
Ukazatel je proměnná, jejímž obsahem je určitá adresa (ve virtuální paměti, případně RAM). Pokud se budeme např. bavit o ukazateli na znak, tak obsahem ukazatele na znak je adresa určitého jednoho znaku (tedy na této adrese ten určitý znak leží) nebo se může klidně jednat o adresu prvního člena pole znaků.
Chtěl bych zdůraznit, že obsahem ukazatele obecně je adresa, se kterou můžeme pracovat pomocí aritmetiky ukazatelů. Tedy můžeme k této adrese přičíst třeba jedničku ( == posun o jeden údaj vpřed). Vždy se tedy posouváme o x údajů (v případě ukazatele na znak tedy o x znaků). To se využívá v případě dynamických polí.
A protože se ukazatele velmi často používají k tvorbě dynamických polí, tak zde uvedu okomentovaný příklad na použití. Nejdříve ale k tvorbě jednorozměrných polí obecně:
Nejdříve definujeme ukazatele na nějaký datový typ. Potom alokujeme paměť pro x prvků daného datového typu a ukazateli přiřadíme adresu prvního z nich. Pomocí indexů či aritmetiky ukazatelů s polem pracujeme. Nakonec uvolníme alokovanou (zabranou) paměť.
/* Vysvětlíme si, jak se postupuje při vytváření jednorozměrného dynamického pole s pomocí ukazatele. */ #include <stdio.h> #define POCET_PRVKU_POLE 14 int main(void) { char *pznak; /* Ukazatel na znak. */ pznak = (char *) malloc(POCET_PRVKU_POLE * sizeof(char)); /* funkce malloc alokovala paměť pro POCET_PRVKU_POLE znaků. */ /* (char *) je přetypování na ukazatel na znak. */ /* sizeof(char) navrátí velikost jednoho znaku. */ *pznak = 'A'; /* Prvni prvek pole (s indexem 0) bude mít hodnotu 'A'. */ /* "*pznak" znamená, že chceme pracovat s hodnotou na adrese, která je obsahem ukazatele. '*' zde představuje tzv. dereferenční operátor. */ *(pznak + 1) = 'B'; /* Druhý prvek (s indexem 1). *(pznak + POCET_PRVKU_POLE - 1) = 'X'; /* poslední prvek */ /* Poznámka: K hodnotám prvků pole lze přistupovat i pomocí indexů, tedy formou "pznak[index] = 'znak';". Je třeba ale zdůraznit, že se čísluje od nuly! Tedy první prvek má index 0! */ /* Alokovanou (zabranou) paměť uvolníme takto: */ free(pznak); }
Nakonec si vysvětlíme dva velmi důležité pojmy v souvislosti s ukazateli:
pznak = &vstup;
*pznak = 'A';
Dokument vytvořil: Begleiter, 11.11.2010 14:52 | Poslední úprava: Luboš Doležel (Doli), 25.11.2010 11:39 | Další přispěvatelé: David Watzke, Begleiter | Historie změn | Zobrazeno: 1694×
Další pojmy: UDS - UI - UID - ukazatel v jazyce C - UML - Unicode - Universal Disk Format
Filtr: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.