何为指针(四)指针,解引用和左值

Pointers or C 英文版翻译

原文:6.7 Pointers,Indirection,and L-values

6.7 指针,解引用和左值


包含指针的表达式可以用来做左值吗?如果可以的话,是那个?我们回到先前的例子。给出下面的声明:

int  a;
int* d=&a;

考虑下面的表达式:

表达式 左值 表达的位置
a yes a
d yes d
*d yes a

指针变量可能被用作左值,不是因为他们是指针,而是因为他们是变量,应用解引用指针变量,说明我们应该要跟踪指针。解引用识别内存的一个特殊位置,所以我们可以使用解引用表达式的结果作为左值。
下面几条语句:

*d=10-*d;
 d=10-*d;   // <--???

第一条语句包含两个解引用。表达式右边作为右值被使用,所以他读取d指向内存的值(a的值)。解引用在左边被当做一个左值,所以d指向的位置接受一个通过右边计算得到的新值。


第二条语句是非法的,因为他指示一个整数储存到一个指针变量中。当我们使用的变量在上下文中与他的类型不一致时,编译器会通过提示帮助我们。这些错误和警告信息是你的朋友。编译器通过生成他们帮助你。尽管我们都不愿意处理这些信息,但是这是改正错误的一个好方法,尤其是那些不会终止编译的警告信息。编译器明确的告诉你错误的位置比你调试程序之后在结局问题容易的多。调试器不会和编译器一样定位问题。


老式的编译器当指针和整型变量被混合时没有任何抱怨。然而,我们知道现在好多了。把指针转换为整数,或者反过来,正真有用的情况很少。通常这些转换是无意中的错误。


译者:小风Code
时间:2017-11-6

猜你喜欢

转载自blog.csdn.net/qq_33775402/article/details/78462663
今日推荐