L’informazione sul modo con cui un dato deve essere trattata dal compilatore è il tipo; i dati in C sono strettamente tipizzati, ovvero caratterizzati dal loro tipo; fanno eccezione i puntatori che possono essere definiti void, ovvero puntatori a un tipo dato non definito.

I tipi dati fondamentali si possono dividere essenzialmente in due categorie: i tipi interi e quelli a virgola mobile. Questi risultano differenti non tanto per il tipo di informazione che rappresentano, ma soprattutto per la modalità con cui questi dati vengono fisicamente codificati all’interno della memoria; tutti gli altri tipi si possono definire a partire da questi, in particolare dal tipo intero, ovvero char e int (il char si può considerare a tutti gli effetti un tipo dati numerico).

Ai tipi definiti si possono poi applicare dei modificatori come short e long; inoltre il modificatore unsigned determina una gestione quando vengono eseguiti dei confronti o dei calcoli aritmetici.

I tipi dati si differenziano in primo luogo dalle unità di memoria che occupano ovvero dal loro numeri di byte; lo standard C definisce delle dimensioni minime per ciascun tipo fondamentale, ma l’implementazione del compilatore può destinare a quel tipo una dimensione maggiore. La dimensione in byte di un tipo dati nell’implementazione che si sta usando può essere verifica attraverso l’operatore sizeof() oppure attraverso le definizioni presenti nell’header limits.h. I dati sono codificati in codice binario; in molti linguaggi di programmazione la codifica delle variabili potrebbe risultare poco importante per il programmatore; anche in C potremmo ignorare completamente il modo con cui i dati sono codificati, ma uno sviluppatore avanzato è in grado di sfruttare le peculiarità delle codifiche per ottimizzare il codice.

A partire dai tipi dati fondamentali si possono creare degli array ovvero una sequenza ordinata di variabili dello stesso tipo e definire dei tipi dati strutturati, ovvero una collezione di dati di tipo diverso.

Costituiscono un caso particolare i puntatori: questi contengono l’indirizzo di un’area di memoria, e si possono considerare analoghi ad una variabile numerica, dal momento in essi si possono effettuare operazioni di confronto e sono valide alcune operazioni aritmetiche. In genere le variabili puntatore indirizzano a variabili ordinari, ma è possibile definire anche puntatori a funzioni!