问题
Possible Duplicate:
In C arrays why is this true? a[5] == 5[a]
I am reading through a tutorial on C and I came across this syntax:
int doses[] = {1, 3, 2, 1000};
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]
Now the point is to get the int 1000
, but the last one doesn't make any sense. Either its late and my brain is not functioning, its something specific to C, or its a typo. I want to cover all my basics when it comes to pointers so reading through it carefully. That means understanding it all. Any answers would be much appreciated!
回答1:
From Wikipedia
Since the expression a[i] is semantically equivalent to *(a+i), which in turn is equivalent to *(i+a), the expression can also be written as i[a], although this form is rarely used.
回答2:
Yes, array subscripting is commutative in C. e1[e2]
is indeed the same as *((e1)+(e2))
. But it is useless in production code, and the only purpose of this notation is to make obfuscated source code.
回答3:
ISO c99 : 6.5.2.1 Array subscripting
1
One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall
have integer type, and the result has type ‘‘type’’.
E1[E2] either E1 will be pointer to object type and E2 will be integer type.
Or,
E1 is integer type and E2 is of pointer to that type
as +
is commutative so E1[E2] == E2[E1]
, because it's actually evaluated as (*(E1+E2))
来源:https://stackoverflow.com/questions/13668014/c-array-arithmetic-and-pointers