Programming is a mind process. You are either good at it or fail early in the process. Not everyone is cut out to be an Astronaut. Expecting a novice to pick it up at an advanced level is pants.
I agree with the "mind process" thing. Programming is hard to learn because you think it is difficult and complicated. I struggled with pointers a lot when I started to learn C. After I started learnin microcontrollers I started to understand pointers.. it was so simple that I was amazed. Pointer is just a memory address. Maybe I understood the concept better with microcontrollers because the memory model is so simple.
I think learnin C programming is easy. Important thing is that you need to know your hardware (or operating system), and that is the more difficult part (my opinion). Implementing complicated algorithms etc. is difficult (in any language).
I agree that C syntax has lot of flaws.. Pointers are a good example of this:
* can be used to declare a pointer or dereference a pointer. It is also multiplication operator. Not good.
Example:
C:
int valueA = 2;
int valueB = 5;
int *pointer;
pointer = &valueB;
return valueA **pointer; // This is perfectly good, but how can you tell what the hell is going on here.. This returns the value 2*5. Really bad syntax.
This is also perfectly valid C syntax, but who can tell what it actually does.. I would need to check some books to find out:
z = y+++x;
And if you want to divide two values, given as pointers, this is not that simple:
ratio = *x/*y;
That won't compile because /* is the start of a comment. You need to write it like this: ratio = *x/(*y);
Or put a space between: ratio = *x/ *y; // Who said that spaces do not matter in C..
And then there is this:
a //*
//*/ b
That is same as 'a/b' in C, but only equal to 'a' in C++. The syntax of C/C++ is really not that great.