之前已经了解了左值,那么这里有两个问题:
- 涉及指针的表达式能不能为左值?
- 如果可以,那么将会是哪些?
间接访问操作符所需要的操作数是个右值,但这个操作符产生的结果是个左值。
引用之前提到过的例子,给定以下声明:
1. #include <stdio.h>
2. int main(void)
3. {
4. int a;
5. int *d=&a;
6. return 0;
7. }
考虑下面的表达式:
表达式 | 左值 | 指定位置 |
---|---|---|
a | 是 | a |
d | 是 | d |
*d | 是 | a |
指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。对指针变量进行间接访问,表示我们应该访问指针所指向的位置。
间接访问指定了一个特定的位置,这样我们可以把间接访问表达式的结果作为左值使用,如下:
1.*d=10-*d;
2.d=10-*d; <—??
第一条语句包含两个间接访问操作,右边的间接访问作为右值使用,所以它的值是d所指向的位置所存储的值(a的值)。
左边的间接访问作为左值使用,所以d所指向的位置(a)把赋值符右侧的表达式的计算结果作为它的新值。
第二条语句则是非法的,因为它表示把一个整型数量(10-*d)存储于一个指针变量中。
当我们实际使用的变量类型和应该使用的变量类型不一致时,编译器会报错,帮助我们判断这种情况。
END!