After learning Java, C basics will feel pretty familiar. Besides the boilerplate, the first times you'll hit major differences are:
- Strings. Java abstracts this away, but Strings are just arrays of chars. In C, there are libraries that can help you work around this.
- User input: You'll need to dereference values to save input values to them. This is as easy as putting an ampersand in front of the variable name you're saving the value to: scanf("%d", &myVar); // scans an int value to the (address of the) variable myVar. In my opinion, this is actually easier than in Java.
- Array sizes! Many of the most popular C compilers won't accept undefined array sizes. While I can store a variable as a size in Java and fill it in later, in C I cannot do that. You can get around this using pointers. Pointers are just variables that point to an address in memory rather than the value(s) in that address. Pointers are defined by adding a * before the variable name.
- Pointers almost immediately imply memory allocation. Both pointers and memory allocation are quite a bit easier than people make them out to be. Let the computer do the math. Need an array of numElements integer values?
- int* myArray = malloc(sizeOf(int) * numElements); // this works on all compilers
- int myArray[] = new int[numElements]; // works just fine in xCode and similar compilers. It is just like in Java.
​
Codecademy has a free C++ course. C++ is its own language with its own standards, but you almost necessarily have to learn the basics of C in the same process. Everything C works in C++, though the opposite isn't necessarily true. If you learn C++, you'll be able to adapt to C in a matter of hours.
Learn C - Free Interactive C Tutorial (learn-c.org) is not the most attractive/user-friendly tutorial, but it's free and gives you a playground to practice your new C skills.
Coursera has a Computational Thinking with C Programming specialization. It's paid, but you can theoretically learn the material without paying (you just won't get graded on the exercises).
If you're feeling ready to tackle data structures, this course (paid again, sorry) on Udemy has a fairly good review of C/C++. The very basics look so much like Java that you won't have to worry about missing those. There is a pretty good review of all the material I listed above at the beginning of this course, so you'll be off to a pretty easy starting point. Challenging yourself with data structures in C/C++ is a great way to take the plunge.
Once you're feeling pretty comfy in C/C++, this Coursera specialization (also paid) is challenging and amazing. If you get through this, you're effectively a C and C++ programmer.
I'm squarely in the camp that doesn't think that C is the best starting point for programming/CS, but I know that you don't have a choice with your course content. That said, if your interest is to learn CS and you already know the basics in a higher level language (Python, JS, Ruby, Java, or C#, among the most popular), take a few hours to learn the very, very basics of assembly. Assembly for architectures like the 6502 is simple and helps make C concepts make a lot more sense. That will give you a much clearer idea of what's going on under the hood and why C does things the way it does. If you just want to get to programming and don't care about Two's complement arithmetic, interrupts, Z-flags, and ALUs, you probably don't need to dig in that far and understand register-by-register/flag-by-flag what is happening in the processor. In that case, skip assembly and play with an Arduino or something to learn C.