C array arithmetic and pointers [duplicate]

試著忘記壹切 提交于 2019-12-10 14:16:20

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!