The C Programming Language (2nd Edition) - Brian W. Kernighan and Dennis M. Ritchie (1988).
- Still a good, short but complete introduction to C (C90, not C99 or later versions), written by the inventor of C.
- However, the language has changed and good C style has developed in the last 25 years, and there are parts of the book that show its age.
The Practice of Programming - Brian W. Kernighan and Rob Pike (1999).
- A very good book to accompany K&R. It uses C++ and Java too.
Programming in C (4th Edition) - Stephen Kochan (2014).
- A good general introduction and tutorial.
C Programming: A Modern Approach (2nd Edition) - K. N. King (2008).
- A good book for learning C.
C: How to Program (8th Edition) - Paul Deitel and Harvey M. Deitel (2015).
- Lots of good tips and best practices for beginners.
- The index is very good and serves as a decent reference (just not fully comprehensive, and very shallow).
Beginning C (5th Edition) - Ivor Horton (2013).
- Very good explanation of pointers
- Using lots of small but complete programs.
Sams Teach Yourself C in 21 Days - Bradley L. Jones and Peter Aitken (2002).
- Very good introductory stuff.
C Interfaces and Implementations - David R. Hanson (1997).
- Provides information on how to define a boundary between an interface and implementation in C in a generic and reusable fashion.
- It also demonstrates this principle by applying it to the implementation of common mechanisms and data structures in C, such as lists, sets, exceptions, string manipulation, memory allocators, and more.
- It's a model of good C programming using modern design techniques (including Liskov's data abstraction), showing how to organize a big C project as a bunch of useful libraries.
The Standard C Library - P.J. Plauger (1992).
- It contains the complete source code to an implementation of the C89 standard library, along with extensive discussion about the design and why the code is designed as shown.
21st Century C: C Tips from the New School - Ben Klemens (2012).
- In addition to the C language, the book explains gdb, valgrind, autotools, and git.
- The comments on style are found in the last part (Chapter 6 and beyond).
Algorithms in C - Robert Sedgewick (1997).
- Gives you a real grasp of implementing algorithms in C.
- Very lucid and clear; will probably make you want to throw away all of your other algorithms books and keep this one.
C Unleashed - Richard Heathfield, Lawrence Kirby, et al. (2000).
- Not ideal, but it is worth intermediate programmers practicing problems written in this book.
- This is a good cookbook-like approach suggested by comp.lang.c contributors.
Modern C — Jens Gustedt (2017).
- Covers C in 5 levels (encounter, acquaintance, cognition, experience, ambition) from beginning C to advanced C.
- It covers C11 threads and atomic access, which few other books do and not all compilers recognize in all environments.
Essential C (Free PDF) - Nick Parlante (2003).
- Note that this describes the C90 language at several points (e.g., in discussing // comments and placement of variable declarations at arbitrary points in the code), so it should be treated with some caution.
C in a Nutshell - Peter Prinz and Tony Crawford (2005).
- Excellent book if you need a reference for C99.
Functional C - Pieter Hartel and Henk Muller (1997).
- Teaches modern practices that are invaluable for low-level programming, with concurrency and modularity in mind.
C Traps and Pitfalls by A. Koenig (1989).
- Very good, but the C style predates standard C, which makes it less recommendable these days.
Build Your Own Lisp — Daniel Holden (2014).
- An enjoyable way to learn C.