C has a tiny surface and a bottomless floor. The syntax fits on a few pages, which fools beginners into thinking they have learned it, right up until a segfault or a corrupted buffer teaches them otherwise. The hard parts of C are not the keywords; they are pointers, memory, and the machine underneath. A careless reading order lets you skip exactly the things that make C dangerous and powerful.
A good sequence builds respect for those parts in stages. You learn the language cleanly, then confront pointers and memory head-on, then use C the way it is meant to be used: talking to the operating system.
Learn the language properly
Start with C programming by K. N. King, a thorough modern introduction that actually teaches the language rather than racing to examples. If you prefer a more visual, puzzle-driven style, Head first C covers the same ground with a lighter touch and good hands-on projects.
Once the basics click, read The C Programming Language by Kernighan and Ritchie. It is terse and old, but it remains the clearest statement of how C thinks, and reading it after a modern intro rather than before makes it click instead of intimidate.
Master pointers and structure
Pointers are where C careers stall, so give them a dedicated book: Understanding and Using C Pointers walks through memory, allocation, and the patterns that cause and cure bugs. Then C interfaces and implementations raises your sights from syntax to design, showing how to build clean, reusable modules in a language that gives you no help doing so.
Program the machine
With the language and its memory model solid, connect C to the hardware. Computer Systems: A Programmer's Perspective is the bridge: it explains how your code becomes instructions, how memory hierarchies work, and why performance behaves the way it does. It reframes everything you have learned.
From there, go into systems programming proper. The Linux Programming Interface is the definitive guide to talking to the Linux kernel, from files to processes to signals, and it is the book that turns a C programmer into a systems programmer. Round it out with Advanced programming in the Unix environment, the classic Unix companion whose depth on the same topics has aged remarkably well.
Read in this order and C stops being a minefield of undefined behavior and becomes a precise tool for controlling the machine. Follow the full path, especially the pointer and systems books, because those are the chapters that separate people who write C from people who understand it.