10.2.3 Accessing Structure Members
Now letʹs look at the arrow operator. The R‐value of the expression px->a is
The ‐> operator applies indirection to px (indicated by the solid arrow) in order to get the structure, and then selects the a member. The expression px->a is used when you have a pointer to a structure but do not know its name. If you knew the name of this structure, you could use the equivalent expression x.a instead.
- >操作符对px 执行间接访问操作〈由实线箭头提示) ,它首先得到它所指向的结构,然后访问成员a 。当你拥有一个指向结构的指针但又不知道结构的名字时,便可以使用表达式px-> a 。如果你知道这个结构的名字,你也可以使用功能相同的表达式x.a 。
Letʹs pause here and compare the expressions *px and px->a to each other. In both cases, the address in px is used to fold the structure. But the first member in the structure is a, so the address of a is the same as the address of the structure. It would seem, then, that px points to the structure and to the first member of the structure: after all, they both have the same address. This analysis is only half correct, though.Although both addresses have the same value, they have different types. The variable px was declared as a pointer to a structure, so the result of the expression *px is the whole structure, not its first member.
在此,我们稍作停顿,相互比较一下表达式*px 和px- >a 。在这两个表达式中, px 所保存的地址都用于寻找这个结构。但结构的第1 个成员是a ,所以a 的地址和结构的地址是一样的。这样px看上去是指向整个结构,同时指向结构的第1 个成员:毕竟,它们具有相同的地址。但是,这个分析只有一半是正确的。尽管两个地址的值是相等的,但它们的类型不同。变量px 被声明为一个指向结构的指针,所以表达式*px 的结果是整个结构, 而不是它的第1 个成员。
Letʹs create a pointer to an integer.
让我们创建一个指向整型的指针。
int *pi;
Can we make pi point to the integer member a? If pi had the same value as px, then the result of the expression *pi would be the member a. But the assignment
我们能不能让pi 指向整型成员a? 如果pi 的值和px 相同,那么表达式*pi 的结果将是成员a 。但是,表达式
pi = px;
illegal because their types do not match. Using a cast works,
是非法的,因为它们的类型不匹配。使用强制类型转换就能奏效:
pi = (int *) px;
but is dangerous because it circumvents the compilerʹs type checking. The correct expression is simpler—to get a pointer to px->a, use the & operator:
但这种方法是很危险的,因为它避开了编译器的类型检查。正确的表达式更为简单——使用&操作符取得一个指向px->a 的指针:
pi = &px->a;
The precedence of the -> operator is higher than that of &, so parentheses are not needed in this expression. Letʹs examine a diagram of &px->a:
->操作符的优先级高于&操作符的优先级,所以这个表达式无需使用括号。让我们检查一下&px->a 的图:
Note how the value in the oval points directly to the a member of the structure, as opposed to px, which points to the entire structure. After the assignment above, pi and px will have the same value. But their types are different, so the result of applying indirection to them will also be different: *px is the whole structure, and *pi is a single integer.
注意椭圆里的值是如何直接指向结构的成员a 的,这与px 相反, 后者指向整个结构。在上面的赋值操作之后, pi 和px 具有相同的值。但它们的类型是不同的,所以对它们使用间接访问操作所得的结果也不一样: *pX 的结果是整个结构, *pi 的结果是一个单一的整型值。
Here is another example using the arrow operator. The value of px->b is a pointer constant because b is an array. This expression is not a legal L‐value. Here is its R‐value.
这里还有一个使用箭头操作符的例子。表达式px-> b 的值是一个指针常量,因为b 是一个数组。这个表达式不是一个合法的左值。下面是它的右值:
If we add indirection to this expression, it selects the first element of the array.With a subscript or pointer arithmetic, other elements of the array can be obtained as well. The expression px->b[1] selects the second array element, like this:
如果我们对这个表达式执行间接访问操作,它将访问数组的第1 个元素。使用下标引用或指针运算,我们还可以访问数组的其他元素。表达式px- >b[l] 访问数组的第2 个元素,如下所示:
上一章 Pointers on C——10 Structures and Unions.7