Portál AbcLinuxu, 27. dubna 2024 00:43

ukazatel v jazyce C

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:

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: 1648×

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: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.