When I studied, C was the first language we learned. I think it was a great way, as we'd learn about memory management, how to do things from "scratch", and since there weren't many batteries included, we kind of just implemented data structures and algorithms as we went on.
It also primed us for more involved classes, like operating systems, compilers, databases, and so on.
But I have to say, it is a language that students really need to fundamentally know if it is going to be used down the road. Sounds obvious, but when I TA'd in more advanced classes (i.e. anything after "introduction to programming"), many of the students that were struggling, were really just struggling with the language - not necessarily the CS concepts. A lot of them were even students that had programming experience prior to enrolling, but had mostly used higher level languages.
When I first learned C I was a teenager coming from x86 assembly, and before that I was only involved with basic scripting. Having the base of how computers worked on the lowest level, as well as familiarizing myself with ROP and how that works. Only then to move onto C, which was a breath of fresh air. I will say that learning Assembly so early on was rough however it really helped with C. I followed the same path that a lot of earlier men and women went through. A lot of individuals back in the day learned a variation of BASIC, then they moved onto Assembly or C (often both) when things were just too slow for their liking.
Going through college I saw exactly what you are saying when it comes to struggling with the language. However most of the individuals I ended up assisting on top of my studying, one-on-one tutoring (if you will); the most glaring thing I noticed was not just a lack of understanding with how the language worked, but more importantly to our discussions, they didn't seem to understand how the fundamentals of computing. How memory is addressed, what exactly are pointers, how de-referencing works in actuality, heap vs. stack, passing to functions to returning values, etc. Once I would walk them through the basics it seemed that they started to understand that while they weren't able to really work effectively within the lower-levels, they would eventually begin to intuit things for themselves much more easily.
I don't believe that all that is required to learn how to write code, however if you know how a machine works, you tend to be able to figure out how to treat it or use it. Like with a manual transmission, if you watch visually how a clutch engages, you'll tend to not burn it as much while letting it do it's job, since you know the fundamentals of how it works. It's no longer the "abstract" or "too complicated to understand". Giving people that knowledge gives them the ability and the confidence to delve deeper and genuinely engage with new ways of doing the same thing they've been doing before.
It also primed us for more involved classes, like operating systems, compilers, databases, and so on.
But I have to say, it is a language that students really need to fundamentally know if it is going to be used down the road. Sounds obvious, but when I TA'd in more advanced classes (i.e. anything after "introduction to programming"), many of the students that were struggling, were really just struggling with the language - not necessarily the CS concepts. A lot of them were even students that had programming experience prior to enrolling, but had mostly used higher level languages.