【C++】C++ 引用详解 ⑥ ( 普通变量 / 一级指针 / 二级指针 做函数参数的作用 )

2023-10-15 16:41:16 浏览数 (1)

一、普通变量 / 一级指针 / 二级指针 做函数参数的作用

1、普通变量 做函数参数的作用

普通变量 的 作用 : 将 普通变量 传入函数作为参数 ,

  • 则可以在 函数 中 , 访问到 该 普通变量 的值 ,
  • 但是 无法修改 该普通变量 ;

2、一级指针 做函数参数的作用

一级指针 的 作用 : 将 普通变量 的 一级指针 传入函数作为参数 ,

  • 可以在函数中 访问 该 一级指针 指向的 普通变量 , 并且可以 修改 该普通变量 的值 ,
  • 但是 该普通变量 所在内存地址 不能被修改 ;

3、二级指针 做函数参数的作用

二级指针 的 作用 : 将 普通变量 的 二级指针 传入函数作为参数 ,

  • 可以在 函数中 访问 该 二级指针 指向的 一级指针 , 以及 访问 一级指针 指向的 内存空间中的 普通变量值 , 不仅可以修改普通变量的值 , 还可以重新创建该普通变量 , 修改 该普通变量在内存中的地址 ;

使用 二级指针 作为参数 , 可以实现如下功能 :

  • 动态内存管理 : 借助二级指针 , 可以在函数中分配或释放内存 ; 如 : 创建一个动态数组或调整现有数组的大小 , 在函数中需要一个指向指针的指针作为参数 , 以便修改原始指针 ;
代码语言:javascript复制
void createArray(int **arr, int size) {  
    *arr = malloc(size * sizeof(int));  
}
  • 修改指针的值 : 借助二级指针 , 可以在函数中修改指针的值 , 即改变它所指向的地址 ; 如果直接传递 一级指针 , 函数只能修改指针指向内存中的数据 , 指针的指向不会改变 ;
代码语言:javascript复制
void changePointer(int **ptr) {  
    int new_value = 10;  
    *ptr = &new_value;  // 修改指针值 
}
  • 传递多维数组 : C 语言中 , 数组名本质上是指向数组第一个元素的指针 , 传递多维数组到函数中通常需要传递一个指向指针的指针 , 即二级指针 ; 借助二级指针 , 函数可以修改原始数组的行指针 ;
代码语言:javascript复制
void process2DArray(int **array, int rows, int cols) {  
    //...  
}

4、代码示例 - 二级指针 做函数参数的作用

Student 是一个结构体 , C 中 结构体 可以当做 类 使用 ;

在 int getStudent(Student** stu) 函数中 , 传入 Student 类的二级指针 , 并在堆内存中创建一个 Student 类 , 赋值给一个临时的一级指针 Student* tmp ;

为 tmp 一级指针 指向的 内存空间 设置一个默认数据 , 作为参考 , 这里将 age 成员设置为 18 ;

将 tmp 一级指针 赋值给 参数中的 Student** stu 二级指针 指向的 内存中 , 即 将 该 二级指针 指向 tmp 一级指针 ;

上述操作 在 函数中 , 修改了 二级指针 指向 的一级指针 的值 , 也就是 修改了 一级指针 的地址 , 一级指针 的内存位置 与原来的 一级指针 内存位置 不同 ;

代码示例 :

代码语言:javascript复制
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

struct Student
{
    char name[64];
    int age;
};

int getStudent(Student** stu)
{
    if (stu == NULL)
    {
        // 传入的参数不合法, 返回错误码 1
        return 1;
    }

    // 声明 Student 类对象
    Student* tmp = NULL;
    // 为声明的 Student 类对象分配内存
    tmp = (Student*)malloc(sizeof(Student));

    if (tmp == NULL)
    {
        // 分配内存失败 , 返回错误码 2
        return 2;
    }

    // 设置结构体成员值
    tmp->age = 18;

    // 将 在 堆内存 中 , 
    // 创建的 Student 类对象设置给
    // 对应的 二级指针 指向的 一级指针 地址
    *stu = tmp;

    // 执行成功
    return 0;
}

int main() {
    // 声明 Student 对象
    Student* stu = NULL;

    // 调用函数 将二级指针传入函数 
    // 在函数内部创建 Student 对象
    getStudent(&stu);

    // 打印结构体成员
    printf("stu->age = %dn", stu->age);


    // 控制台暂停
    system("pause");

    return 0;
}

执行结果 :

代码语言:javascript复制
stu->age = 18
请按任意键继续. . .

0 人点赞