6.7 指针、间接访问和左值
间接访问操作符所需要的操作数是个右值,但这个操作符所产生的结果是个左值。
给定下面这些声明:
int a;
int *d = &a;
表6.3 表达式示例
表达式 左值 指定位置
a 是 a
d 是 d
*d 是 a
指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。对指针变量进行间接访问表示我们应该访问指针所指向的位置。间接访问指定了一个特定的内存位置,这样我们可以把间接访问表达式的结果作为左值使用。在下面这两条语句中:
*d = 10 - *d;
d = 10 - *d; <--???
第1条语句包含了两个间接访问操作。右边的间接访问作为右值引用,所以它的值是d所指向的位置所存的值(a的值)。左边的间接访问作为左值使用,所以d所指向的位置(a)把赋值符右侧的表达式的计算结果作为它的新值。
第2条语句非法的,因为它表示把一个整型变量(10-*d)存储于一个指针变量中。当实际使用的变量类型和应该使用的变量类型不一致时,编译器会发出警告,帮助我们判断这种情况。尽管被迫处理这些信息是我们很不情愿干的事情,但改正这些错误(尤其是那些不会中止编译过程的警告信息)确实是个好主意。在修正程序方面,让编译器告诉你哪里错了比你以后自己调试程序要方便得多。调试器无法像编译器那样准确地查明这些问题。
K&R C:
当混用指针和整型值时,旧式C编译器并不会发出警告。但是,我们现在对这方面的知识了解得更透彻一些了。把整型值转换为指针或把指针转换成整型值是极为罕见的,通常这类转换属于无意识的错误。
C和指针 第6章 指针 6.7 指针、间接访问和左值
于 2022-06-14 22:56:27 首次发布