>> not how it maps to machines and memory with pointers
But it's worth remembering that C was intended to be a portable assembler. The operators match up well to PDP11 assembly code (for obvious reasons), relatively well to other Von Neuman machines, allowing a programmer to switch back and forth. Pointers were how the base machine worked. C's ability to cast a pointer into a pointer-to a struct, array, or whatever lets the programmer unload the pointer math onto the compiler. Referencing data of dimensional arrays of structs in assembler requires... concentration. Much less fraught in C.
I'd agree that *now* programming should be done in higher level terms as CPUs are enough faster and compiler optimization steps are enough better for there to no longer be a need - excepting some specialized scenarios like real-time code running in a systems level handler.
Disclaimer: I came to C after a decade or so of various assemblers. Loved what it could do.