&gt; In both cases, the compiler supposedly looks up the name on the right to figure out which struct type you intended. So foo-&gt;bar if foo is an integer would do something like ((Foo<i>)foo)-&gt;bar where Foo is a struct that contains a member named bar, and foo.bar would be like ((Foo</i>)&amp;foo)-&gt;bar. The text doesn’t say how ambiguity is resolved (i.e., if there are multiple structs that have a member with the given name).<p>This is because in pre-ANSI C the names of struct fields were not internal to their enclosing struct but global identifiers that simply represented a type and offset. There was no ambiguity because different structs could not have the same member names. As raimue pointed out this is why some *nix struct members are still prefixed with a namespace like st_ for struct stat.