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

6.4 间接访问操作符
    通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing the pointer)。这个用于执行间接访问的操作符是单目操作符*。表6.2列举了一些例子。它们使用了前面小节里的一些声明。
    表6.2                    间接访问操作符的一些示例
    表达式                右值            类型 
    a                     112             int
    b                     -1                int
    c                    3.14            float
    d                     100                int *
    e                    108                float *
    *d                    112                int
    *e                    3.14            float
    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和指针 第6章 指针 6.4 间接访问操作符_第1张图片

*/ 

你可能感兴趣的:(C和指针,第6章,指针,c语言,开发语言,c++)