3. 指针解引用

上节课我们讲解了如何来声明一个指针变量。这节课我们来讲解如何通过 指针解引用 来操作指针指向的变量。

引用(Reference) 原本是在 C++ 中才有的数据类型,在 C++ 中,一个引用相当于一个变量的别名,用引用可以操作实际关联的变量,从而实现对原有关联变量的访问和修改。

指针解引用(Dereference) 是通过星号(*)运算符后跟一个指针(指针变量或指针常量)的运算。通过 指针解引用 运算,你可以对指针指向的内存内的数据进行取值或赋值等操作。

在 C 语言中 通过 指针解引用 ,可实现对指针指向的变量的引用操作。即通过 指针解引用 可以操作指针指向的变量,即指向变量的引用操作。

语法:

* 指针

说明

  1. 指针解引用 返回的数据是指针指向的变量的引用。
  2. 指针解引用 后能够引用的内存数据范围和指针本身的类型相关。
  3. 指针解引用 后能够引用的数据类型是指针类型去掉一个星号(*)后的类型,如:指针 p 的类型为 char*,则解引用后 *p 的类型为 char

示例:

// file: pionter_dereference.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    int x = 1;
    char ch = 'A';
    int *p1 = &x;
    char * p2 = &ch;

    // 打印x,和 *p1 值
    printf("x:%d, *p1:%d\n", x, *p1);
    // 通过指针 p1 修改 x 的值
    *p1 = 100;
    printf("x:%d, *p1:%d\n", x, *p1);

    // 修改 ch 的值
    ch = 'B';
    printf("ch:%c, *p2:%c\n", ch, *p2);

    // 打印指针 p1 和 p2 占用的内存长度。
    printf("sizeof(p1):%ld, sizeof(p2):%ld\n", sizeof(p1), sizeof(p2));
    // 打印指针 p1 和 p2 解引用后的数据占用的内存长度。
    printf("sizeof(*p1):%ld, sizeof(*p2):%ld\n", sizeof(*p1), sizeof(*p2));

    return 0;
}

运行结果如下:

weimingze@mzstudio:~$  gcc -o pionter_dereference pionter_dereference.c
weimingze@mzstudio:~$  ./pionter_dereference
x:1, *p1:1
x:100, *p1:100
ch:B, *p2:B
sizeof(p1):8, sizeof(p2):8
sizeof(*p1):4, sizeof(*p2):1

通过上述运行结果可以得出。

  1. 要修改 x 变量的值有两种方法,
    1. 直接对变量 x 赋值。
    2. 使用 指向 x 变量的指针 p1 再对其解引用后赋值,即 *p1 = 100 也可以修改 x 变量。
  2. 变量 x 的值变化,则指向此变量的指针解引用的值也会随之变化,因为p1解引用后 *p1 就是 x 变量。
  3. 指针解引用后的实际是指向的变量,因此 sizeof(*p1) 的值是 4, sizeof(*p2) 的值是 1。

练习:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int x = 100, y = 200;
    int *px = &x, *py = &y;
    int temp;
    printf("x:%d, y:%d", x, y); // 打印: x:100, y:100
    // 使用指针交换 变量 x, y 的值(禁止对 x, y 变量进行赋值运算),
    // ...

    printf("x:%d, y:%d", x, y); // 打印: x:200, y:100
    return 0;
}