Pole slouží k uchování více proměnných stejného typu. V jazyce C je jeho velikost definována předem a lze klasicky vytvořit i pole vícerozměrné (takové pole prakticky do svých hodnot přiřazuje další pole o zvolené velikosti – dvojrozměrné by tedy vytvářelo 2D prostor).
Deklarace v jazyce C se provádí stejně jako deklarace proměnné, akorát je za název vložen popis pole s rozměry:
int pole[10];
char dvojpole[10][6];
Přístup k jednotlivým hodnotám se provádí obdobně (je třeba dbát na to, že hodnoty začínají nulou):
printf(„Paty prvek pole celych cisel: %d“, pole[4]);
Pointery jsou velmi podobné normálním proměnným, ale jejich hodnotou je nějaká adresa v paměti. Adresu můžeme z normálních proměnných získat přidáním referenčního operátoru & před danou proměnnou (takto ji můžeme například předat ukazateli). K přístupu k hodnotám na dané adrese pak slouží operátor dereference *.
Pointery využívají podobné deklarace jako normální proměnné, za jejich typ je však připojen znak *. Využívá se tedy formy typ* identifikátor:
char* ukazatel;
Pro (dynamickou) deklaraci je také důležitá funkce malloc(). Touto funkcí lze alokovat místo v paměti (bez alokace ukazuje pointer na NULL kvůli ochraně skryté paměti). K alokaci využíváme konverzi na zvolený typ pointeru (malloc vrací void*) a pro univerzálnost i sizeof():
ukazatel = (char*) malloc(sizeof(char));
Uvolnění paměti provádíme funkcí free(), které musíme předat adresu ukazatele.
Mezi polem a ukazatelem je velmi úzký vztah – jsou teoreticky zaměnitelné.
Pokud k pointeru přičteme celé číslo, posune se nám jeho adresa o stejný počet hodnot zvoleného typu dále (například pro ukazatele int* by došlo k posunu o čtyři bajty). Dereferencí pak můžeme s pointery pracovat podobně jako s polem (dokonce lze využít i zápis s hranatými závorkami).
Ukazatel na začátek pole se dá díky výše zmíněnému přičítání využít přímo jako pole. Dvojrozměrné [10][10] pole znaků bychom tedy vytvořili takto (vynechána kontrola návratu NULL, která by se měla ošetřit pomocí free()):
char* * array;
array = (char* *) malloc(10 * sizeof(char*));
for (i = 0; i < x; i++) { array[i] = (char*) malloc(10 * sizeof(char)); }