开发者

Difference between pointers to variables, and pointers to structures in C

开发者 https://www.devze.com 2022-12-20 14:35 出处:网络
In learning C, I\'ve just begun studying pointers to structur开发者_如何学运维es and have some questions.

In learning C, I've just begun studying pointers to structur开发者_如何学运维es and have some questions.

Suppose I were to create a structure named myStructure, and then create a pointer myStructurePointer, pointing to myStructure. Is *myStructurePointer, and myStructure two ways of referencing the same thing? If so, why is it necessary to have the -> operator? It seems simpler to use *myStructurePointer.variable_name than myStructurePointer->variable_name.


You're right,

(*structurePointer).field

is exactly the same as

structurePointer->field

What you have, however, is :

*structurePointer.field

Which really tries to use the . operator on the pointer variable, then dereference the result of that - it won't even compile. You need the parentheses as I have them in the first example above if you want the expressions to be equivalent. The arrow saves at least a couple of keystrokes in this simple case.

The use of -> might make more sense if you think about the case where the structure field has pointer type, maybe to another structure:

structurePointer->field->field2

vs.

(*(*structurePointer).field).field2


The problem with *myStructurePointer.variable_name is that * binds less tight than ., so it would be interpreted as *(myStructurePointer.variable_name). The equivalent of myStructurePointer->variable_name would be (*myStructurePointer).variable_name, where the parenthesis are required.

There is not difference between a->b and (*a).b, but -> is easier to use, especially if there are nested structures. (*(*(*a).b).c).d is much less readable than ´a->b->c->d`.


To generalize, learn your C operator precedence:

  • C Operator Precedence Table

Here the "." operator is processed before the "*" -> hence the need for parentheses


Dennis Ritchie did note once that deref should probably have been a postfix operator1

Right, the following are equivalent:

pointer->field
(*pointer).field
pointer[0].field

If the indirection operator had postfix syntax C would have looked rather different but in that case it would not have needed -> at all.

It's interesting to think about how the common C idioms would look in that alternate universe...

do s1++* = c = s2++*;
   while(c);

while(n-- > 0)
    s++* = '\0';

p*.x = 1;
p*.y = 2;
. . .
. . .
. . .

1. See The Development of the C Language., Dennis M. Ritchie


Using the * dereferences the pointer, so you can use dot syntax to access the fields. If you don't dereference the pointer, then you use -> to access the fields. You can use whichever you prefer.


I have been learning C recently, and i found this resource to be extremely helpful.

http://claymore.engineer.gvsu.edu/~steriana/226/C.CheatSheet.pdf

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号