You can access their lectures, notes, problem sets, slides, and other material for free on their course website [0] and on edX [1]. A warning in advance before you click the course website link though! It's currently Halloween, and the page features an autoplaying scream sound. You've been warned!
[0]: https://cs50.harvard.edu/2018/fall/
[1]: https://www.edx.org/course/cs50s-introduction-computer-scien...
Personally I would recommend teaching some simple type-less language first. This will be their 'Crutch' language, used to test out simple algorithms.
Then I would teach them assembly language. Make sure they call subroutines and use pointers, but on a simple level. Like sort an array of strings.
Then I would teach them the C and show how it directly and easily translates to assembly. Having done assembly they should have an easier time of pointers. As we all know, pointers is what makes the new C programmers cry. Well that and freeing the same space twice.
In my view, C really only makes sense in the context of manipulating data in and out of the heap and the stack. So once you're past basic syntax, I guess start there: the heap and the stack. When you grasp that, I feel like you can stand on solid fundamentals on how computers work going forward.
Behavior that is observed in a C program is not necessarily one that is required. If that behavior is required at all, it might only be required by the platform or implementation, not by the language.
Students should not be discouraged from learning by experimenting, but they have to take the results with a grain of salt. Question, research and discuss everything.