016. 使用指针访问和修改变量值

在C语言中,指针是一种非常强大的工具,可以用来访问和修改变量的值。指针通过存储变量的内存地址来间接操作变量。以下将通过具体示例展示如何使用指针来访问和修改变量的值。

1. 声明和初始化指针

首先,需要声明一个指针,并将其初始化为某个变量的地址。

示例代码

#include <stdio.h>

int main() {
    int num = 10; // 声明一个整数变量
    int *ptr = &num; // 声明一个指针并初始化为num的地址

    printf("Value of num: %d\n", num); // 直接访问变量num的值
    printf("Address of num: %p\n", &num); // 输出变量num的地址
    printf("Value of num via pointer: %d\n", *ptr); // 通过指针访问num的值
    printf("Address stored in ptr: %p\n", ptr); // 输出指针ptr中存储的地址

    return 0;
}

输出结果

Value of num: 10
Address of num: 0x7ffd5b9a5a44
Value of num via pointer: 10
Address stored in ptr: 0x7ffd5b9a5a44

2. 通过指针修改变量的值

可以通过指针来修改它所指向的变量的值。

示例代码

#include <stdio.h>

int main() {
    int num = 10; // 声明一个整数变量
    int *ptr = &num; // 声明一个指针并初始化为num的地址

    printf("Original value of num: %d\n", num); // 输出原始值
    printf("Original value of num via pointer: %d\n", *ptr); // 通过指针输出原始值

    *ptr = 20; // 通过指针修改num的值

    printf("Modified value of num: %d\n", num); // 输出修改后的值
    printf("Modified value of num via pointer: %d\n", *ptr); // 通过指针输出修改后的值

    return 0;
}

输出结果

Original value of num: 10
Original value of num via pointer: 10
Modified value of num: 20
Modified value of num via pointer: 20

3. 指针的指针

指针也可以指向另一个指针。这种情况下,需要使用多个*来声明和访问。

示例代码

#include <stdio.h>

int main() {
    int num = 10; // 声明一个整数变量
    int *ptr = &num; // 声明一个指针并初始化为num的地址
    int **ptrPtr = &ptr; // 声明一个指针的指针并初始化为ptr的地址

    printf("Original value of num: %d\n", num); // 输出原始值
    printf("Original value of num via pointer: %d\n", *ptr); // 通过指针输出原始值
    printf("Original value of num via pointer of pointer: %d\n", **ptrPtr); // 通过指针的指针输出原始值

    **ptrPtr = 20; // 通过指针的指针修改num的值

    printf("Modified value of num: %d\n", num); // 输出修改后的值
    printf("Modified value of num via pointer: %d\n", *ptr); // 通过指针输出修改后的值
    printf("Modified value of num via pointer of pointer: %d\n", **ptrPtr); // 通过指针的指针输出修改后的值

    return 0;
}

输出结果

Original value of num: 10
Original value of num via pointer: 10
Original value of num via pointer of pointer: 10
Modified value of num: 20
Modified value of num via pointer: 20
Modified value of num via pointer of pointer: 20

4. 指针数组

指针数组是一个数组,其中的每个元素都是一个指针。可以通过指针数组访问和修改多个变量的值。

示例代码

#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30;
    int *ptrArray[3]; // 声明一个指针数组,包含3个指针

    ptrArray[0] = &a; // 将第一个指针初始化为a的地址
    ptrArray[1] = &b; // 将第二个指针初始化为b的地址
    ptrArray[2] = &c; // 将第三个指针初始化为c的地址

    printf("Original value of a: %d\n", *ptrArray[0]); // 通过指针数组访问a的值
    printf("Original value of b: %d\n", *ptrArray[1]); // 通过指针数组访问b的值
    printf("Original value of c: %d\n", *ptrArray[2]); // 通过指针数组访问c的值

    *ptrArray[1] = 25; // 通过指针数组修改b的值

    printf("Modified value of a: %d\n", *ptrArray[0]); // 输出修改后的值
    printf("Modified value of b: %d\n", *ptrArray[1]); // 输出修改后的值
    printf("Modified value of c: %d\n", *ptrArray[2]); // 输出修改后的值

    return 0;
}

输出结果

Original value of a: 10
Original value of b: 20
Original value of c: 30
Modified value of a: 10
Modified value of b: 25
Modified value of c: 30

5. 动态分配的指针

可以使用malloccalloc动态分配内存,并通过指针访问和修改动态分配的内存。

示例代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(sizeof(int)); // 动态分配一个整数大小的内存
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    *ptr = 10; // 通过指针初始化动态分配的内存
    printf("Original value: %d\n", *ptr); // 输出原始值

    *ptr = 20; // 通过指针修改动态分配的内存
    printf("Modified value: %d\n", *ptr); // 输出修改后的值

    free(ptr); // 释放动态分配的内存

    return 0;
}

输出结果

Original value: 10
Modified value: 20

通过上述示例,你可以看到如何使用指针来访问和修改变量的值。关键点包括:

  1. 声明指针:指定指针所指向的变量类型。
  2. 初始化指针:可以初始化为某个变量的地址或动态分配的内存地址。
  3. 访问变量值:通过*运算符访问指针所指向的变量的值。
  4. 修改变量值:通过*运算符修改指针所指向的变量的值。
  5. 指针的指针:可以使用多个*来声明和访问。
  6. 指针数组:可以声明一个数组,其中的每个元素都是一个指针。
  7. 动态分配的指针:可以使用malloccalloc动态分配内存,并通过指针访问和修改。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)