C和指针|C和指针 第6章 指针 6.4 间接访问操作符

6.4 间接访问操作符
通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer)。这个用于执行间接访问的操作符是单目操作符*。表6.2列举了一些例子。它们使用了前面小节里的一些声明。
表6.2间接访问操作符的一些示例
表达式右值类型
a112int
b-1int
c3.14float
d100int *
e108float *
*d112int
*e3.14float
d的值是100。当我们对d使用间接访问操作符时,它表示访问内存位置100并察看那里的值。因此,*d的右值是112---位置100的内容,它的左值是位置100本身。
注意上面列表中各个表达式的类型:d是一个指向整型的指针,对它进行解引用操作符将产生一个整型值。类似地,对float*进行间接访问将产生一个float型值。
正常情况下,我们并不知道编译器为每个变量所选择的内存位置,所以事先无法预测它们的地址。这样,当我们绘制内存中的指针时,用实际数值表示地址是不方便的。所以绝大部分图书改用箭头来代替,如下所示。
但是,这种记法可能会引起误解,因为箭头可以会使你误以为执行了间接访问操作,但事实上它并不一定会进行这个操作。事实上,如果不对指针进行间接访问操作,它的值只是简单的一些位的集合。当执行间接访问操作时,这种记法才使用实现箭头表示实际发生的内存访问。
注意,箭头起始于方框内部,因为它表示存储于该变量的值。同样,箭头指向一个位置,而不是存储于该位置的值。这种记法提示跟随箭头执行间接访问操作的结果将是一个左值。事实上的确如此,我们在以后将看到这一点。
尽管这种箭头记法很有用,但为了正确地使用它,必须记住指针变量的值就是一个数字。箭头显示了这个数字的值,但箭头记法并未改变它本身就是个数字的事实。指针并不存在内建的间接访问属性,所以除非表达式中存在间接访问操作符,否则不能按箭头所示实际访问它所执行的位置。

/*
**测试间接访问操作符。
*/
#include
#include
int main( void ){
int i = 3;
int *pi = &i;

printf( "print the address of i:\n" );
printf( "pi = %p, &i = %p\n", pi, &i );
printf( "print the value of i:\n" );
printf( "*pi = %d, i = %d\n", *pi, i );
/* *pi = 6, *pi is used to be left value */
*pi = 6;
/* i = *pi, *pi is used to be right value */
i = *pi;
printf( "after *pi = 6, i = *pi:\n" );
printf( "print the address of i:\n" );
printf( "pi = %p, &i = %p\n", pi, &i );
printf( "print the value of i:\n" );
printf( "*pi = %d, i = %d\n", *pi, i );
return EXIT_SUCCESS;
}
/* 输出:
C和指针|C和指针 第6章 指针 6.4 间接访问操作符
文章图片

【C和指针|C和指针 第6章 指针 6.4 间接访问操作符】*/

    推荐阅读