Per capire le origini del linguaggio C, bisogna parlare della storia del sistema operativo UNIX in quanto è stato sviluppato su questo sistema operativo ed, anzi, lo stesso sistema operativo ed i suoi programmi sono scritti in C.
Nonostante tutto il linguaggio C non è, però, legato solo alla programmazione dei sistemi operativi, ma con esso possono essere scritti (e sono stati scritti) grossi programmi di calcolo, word-processing e database.
Ken Thompson nel 1969 iniziò a lavorare su un computer di nome PDP-7, utilizzando il linguaggio assembler; l'idea di base era di scrivere un linguaggio ad alto livello per l'implementazione di sistemi operativi. Thompson prese spunto dal CPL (Combined Programming Language) e dal BCPL (Basic CPL - 1967) per creare il linguaggio B che risultava, però, essere ancora troppo pesante per l'hardware a disposizione.
Nel 1972, un collaboratore di Thompson, Dennis Ritchie ottimizzò ulteriormente il B (creando una prima versione chiamata NB), restituendogli alcune funzionalità del BCPL ed inventando quello che ad oggi viene chiamato Linguaggio C, che permise di riscrivere quasi totalmente lo UNIX di Thompson, questa volta per un computer più avanzato, il PDP-11.
Inaspettatamente il C permise di riscrivere lo UNIX per il PDP-11 in tempi rapidissimi e ciò spinse Thompson, Ritchie e Kernighan a scrivere il kernel anche per l' "Interdata 8/32" ed il "Dec VAX 11/780", quest'ultimo, all'epoca, particolarmente popolare.
tra il 1973 ed il 1980 il linguaggio C si diffuse anche su architetture Honeywell 635 e IBM 360/370, grazie al lavoro ad opera del ricercatore Johnson che sviluppò il compilatore ppc, alla nascita delle prime librerie (un certo Lesk sviluppò il "portable I/O package", rinominato "standard I/O library") e alla scrittura di un libro di riferimento da parte Kernighan e Ritchie nel 1978, il "C Programming Language", o come viene comunemente chiamato "Libro bianco".
In questi anni c'era un po' di confusione, primo perché il C non era uguale a quello che conosciamo oggi, ma manteneva una compatibilità con i linguaggi da cui derivava (il BCPL ed il B), ed il "Libro bianco" era nato proprio dall'esigenza di scrivere codice portabile che permettesse l'evolversi del linguaggio.
Negli anni '80 i compilatori erano basati principalmente sul pcc di Johnson, ma nacquero molti compilatori indipendenti che non erano conformi al pcc, ma che permisero la diffusione del C praticamente su tutte le macchine più popolari; per questo il comitato ANSI (American Standards Institute) X3J11, nel 1983, iniziò a sviluppare uno standard per il linguaggio C, aggiungendo importanti caratteristiche ed ufficializzando molte caratteristiche presenti nei diversi compilatori.
Nel 1989 si arrivò quindi allo standard ISO/IEC 9899-1990 (che chiameremo ANSI89 per comodità) che venne usato come base per tutti i compilatori.
Nel medesimo periodo ci fu un'altra importante standardizzazione che mirava a definire l'interfaccia tra linguaggio e sistema operativo. Prendendo spunto proprio dall'ANSI89, fu creata la "Portable Operating System Interface" (POSIX) ad opera dell'IEEE (Institute of Electrical and Electronics Engeneers) che definisce, inoltre, i concetti di thread, socket, estensioni realtime e molto altro, in modo unico e indipendente dall'implementazione.
Nonostante negli anni il C sia stato implementato sia con lo standard ANSI, che in maniera proprietaria, grazie a questi strumenti il C è diventato (ed è tutt'oggi) il linguaggio più utilizzato al mondo, almeno fino all'avvento del C++ (chiamato originariamente "C con classi") che è stato anche la spinta del miglioramento nel tempo del C attraverso lo standard ANSI, di cui è stata rilasciata un'ultima versione denominata ANSI99, che è supportata dalle ultime versioni del gcc.