So you think you know pointers?
stackoverflow.com
stackoverflow.com
I think the C++ programming book I first used made it worse by equating pointers and arrays from the start, making it seem like they were interchangeable.
At least for me, no other languages including assembler seemed to generate this amount of confusion over such a simple thing.
The semantics associated with accessing those elements in C is anything but, especially for a beginner.
http://c-faq.com/aryptr/aryptrequiv.html
In fact it's filled with great sections - go read it if you haven't.
It's a funny little book that can keep you busy during compilation time.
And the "C Reference Manual" (http://www.careferencemanual.com/) is the best, up-to-date reference to understand how this small language can be abused.
struct { int x[4] } s;
...then &s, &s.x and s.x would all evaluate to the same address, but with three different types.News flash: it's easy to confuse people such as myself who don't know, and don't care, whether the & unary operator is above or below the + binary operator in the precedence hierarchy. Anyone who writes an expression like this without parentheses has been educated beyond their wisdom. Ric has more at 11.
Me, I looked it up. He only said not to compile it, not that you couldn't learn something at the same time.
As usual you marginally write code for the compiler (or to impress you boss on how well you understand the C standard). The Very Important Reader of the code is the guy who fave to read it in the comings years to improve/fix something (and usually is the same soul who originally wrote the stuff).
So make a favor to yourself and write code you'll enjoying read at loony nights (as usual happens when something don't works).
and any C/C++ programmer who have spent few days with the language will never be confused by that
see http://www.cplusplus.com/doc/tutorial/pointers/
---- This reference to a variable can be obtained by preceding the identifier of a variable with an ampersand sign (&), known as reference operator, and which can be literally translated as "address of". ----
If (&x) returns "the address of x," you'd be inclined to say that ((&x) + 1) is one byte higher than &x, even though the C compiler will calculate the actual answer based on the size of x.
If x is an array as in this example, you'd have to know that C does this arithmetic based on the entire length of the statically defined array, rather than a single element as it would for a dynamically defined array with a pointer to it.
This is completely non-obvious, at least to me.
So parsing &x + 1 into English becomes:
"The address of x plus one."
Except that, more explicitly, we should say:
"The address of x plus one times the size of the type of x."
What you should say is so far removed from the C code appears to say (add 1 to something) that confusion is inevitable.
That the second term should depend on the implicit type information from the first term, especially when the "address" operator has precedence over the + operator, seems backward to me.
To me an address is just a number, it carries no type information. Translate to s-expressions:
(+ (address-of x) 1)
Does it make sense that the 1 would change value based on the result of "address-of"? Not to me. I think it's bad design. Now, if it were taught differently:
(+ (typed-reference-to x) 1)
Then it makes more sense.
but when you see something tagged as 'C', 'pointers', 'challenge' I guess you can fairly assume it is an "advanced subject" for people already experienced in C no ?
Not to defend that guy or anything.
In case you mean exponentiation, these expressions would always be equal regardless of the precedence of the operators.
/rolls eyes
Does this mean I write code so that it can be read by someone with little experience? Yes, generally. Does this mean I am constantly having to verify my assumptions, as if I don't know anything? Yes, it does. There are some things that I'll take a pass on verifying, but if elevates a problem and everything else checks out, I'm going to seart looking at the parts that I "know" are fine.
But ryanf, while not defending "that guy" (me), made my point for me: if I have to stop and think about whether -3^5 == -(3^5) because some hotshot didn't consider it manly to use parentheses, nobody wins.
If I were writing that expression I'd use (yes, completely unnecessary) parentheses around &a out of habit... the same habit that wouldn't let me write -3^5. Either way, it doesn't burn any more cycles.
even me a noob in C I can see that it is indeed a reference (as I said I m a noob =))
i.2+$i.3
0 1 2 3 4
That's "i. 2 + $ i. 3" (iota 2 plus shape_of iota 3), which parses as i.(2 + $(i. 3)). iota returns an array from 0 to n, + adds, shape_of returns the dimensions of a array/matrix/n-dimensional matrix/etc. + is a binary operator ("dyad"), i. and $ are unary operators ("monads", no relation to Haskell).