张银峰的编程课堂

访问指针的值

通过对指针变量解引用,实现数据的读取与修改,相当于操作原对象,这称为间接访问。

#include <stdio.h>

int main()
{
    int a = 2;
    int *p = &a;

    // *p:解引用p指向的地址处的值
    printf("*p=%d\n", *p);

    // 错误:指针变量的值,存储的是一个地址,而不是数值。
    // p = 5;

    // *p在赋值运行符左边,代表为该地址的变量赋值
    // p指向a,这里*p代表向a赋值
    *p = 5;

    // p是的a间接引用,两者是一致的。
    printf("a=%d\n", a);
    printf("*p=%d\n", *p);

    return 0;
}

glimix.com

ZYF

重新指向

指针自身也是变量,这就代表它可以被重新赋值,也就说重新指向另一个对象。

#include <stdio.h>

int main()
{
    int a = 2;
    int *p = &a;

    // 指针本身也是变量,也就是说它可以指向其它对象。
    // 这时指针将指向b,而非a了。
    int b;
    p = &b;

    // 现在对*p的修改相当于改变b的值
    *p = 123;
    printf("a=%d\n", a);
    printf("b=%d\n", b);
    printf("*p=%d\n", *p);

    return 0;
}

glimix.com

花式访问

这个示例中,我们变着花样访问数值,目的是让我们更好的理指针与值的概念。

int main()
{
    // 每个变量都有一个唯一的地址
    int a = 7;

    // 取变量a的址址,只是没有把它赋给一个指针罢了!
    &a;

    // 先取地址,再访问此地址处的值,只不过这个值没有参与任何运算罢了。
    *&a;

    // 这与上面语句效果相同
    a;

    printf("a=%d\n", *&a);

    *&a = 256;
    printf("a=%d\n", *&a);

    // 相当于 int *pa = &a;
    int *pa = &*&a;
    printf("*pa=%d\n", *pa);

    *pa = 128;
    printf("*pa=%d\n", *pa);
    printf("a=%d\n", a);

    return 0;
}

glimix.com

ZYF