Since C lacks a lot of high-level language features of today (OOP, overloading, templates, etc.), There is limited overhead and therefore compilers can generate very efficient code. Also, there is little runtime support needed, no garbage collection for example. Pointers also make it easy to interact with the low-level stuff.