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

2023-08-27 19:17:53





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




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


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

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

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


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

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

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


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

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

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

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

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


代码示例 :

// 导入标准 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 = %d\n", stu->age);


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

    return 0;
}

执行结果 :

stu->age = 18
请按任意键继续. . .

在这里插入图片描述

更多推荐

Go基础-文件、字符

文件创建导入“os”包,创建文件,读写文件的函数都在改包。指定创建的文件存放路径以及文件名。执行Create()函数,进行文件创建。关闭文件。packagemainimport("fmt""os")funcmain(){//创建文件,需要指定文件的存放路径以及文件名称//file为文件指针file,err:=os.Cr

C#控制台程序中使用log4.net来输出日志

Apachelog4net库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net是优秀的Apachelog4j™框架到Microsoft®.NE​​T运行时的端口。我喜欢他可以自定义输出,区分等级等特点。导入库我们在工程里添加NuGet的包。输入名称log4net,导入包。创建配置文件然后我们在项目根创建

北邮22级信通院数电:Verilog-FPGA(3)实验“跑通第一个例程”modelsim仿真及遇到的问题汇总(持续更新中)

北邮22信通一枚~跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章持续关注作者迎接数电实验学习~获取更多文章,请访问专栏:北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客注意:本篇文章所有绝对路径的展示都来自上一篇博客北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下

蓝蓝设计提供气象行业软件设计

北京蓝蓝设计在气象行业软件界面设计方面具有成功的案例和丰富的经验。蓝蓝与多家气象行业软件开发商合作,为其设计了一系列优秀的界面,得到了客户的高度认可和好评。我们的设计作品不仅满足了客户的需求,还提升了软件的品牌形象和竞争力。北京蓝蓝设计还致力于学习和应用最新的设计技术和工具。我们紧跟行业发展的脚步,不断更新自己的设计理

JMeter 设置请求头信息的详细步骤

在使用JMeter的过程中,我们会遇到需要设置请求头信息的场景。比如:POST传过去的Body数据是json格式的。需要填添加头信息:Content-Type:application/json。在header中用token来传用户的认证信息。下面,来具体介绍下JMeter设置HTTP请求头的方法。1添加请求头右击HTT

Jmeter系列-并发线程Concurrency Thread Group的介绍(7)

简介ConcurrencyThreadGroup提供了用于配置多个线程计划的简化方法,该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程ConcurrencyThreadGroup提供了更好的用户行为模拟,因为它使您可以更轻松地控制测试的时间,并创建替换线程以防线程在过程中完成现在安装

Jmeter系列-控制器Controllers的介绍(8)

Controllers简介JMeter是一款功能强大的性能测试工具,而控制器是JMeter中非常重要的一个组件。控制器用于控制测试计划的执行流程,可以根据需求来控制线程的启动、停止、循环等操作。Jmeter有两种类型的控制器:Samplers(取样器)和LogicalControllers(逻辑控制器);它们驱动着测试

Jmeter —— 常用的几种断言方法(基本用法)

在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过,本文主要介绍几种常用的断言:响应断言、JSON断言、BeanShell断言一、响应断言1.响应断言是最常用的一种断言方法,它可以对各种返回类型的结

四、数学建模之图与网络模型

1.定义2.例题及软件代码求解一、定义1.图和网络是相关概念(1)图(Graph):图是数学和计算机科学中的一个抽象概念,它由一组节点(顶点)和连接这些节点的边组成。图可以是有向的(有方向的,边有箭头表示方向)或无向的(没有方向的,边没有箭头表示方向)。图用于表示各种关系,如社交网络、电路、地图、组织结构等。(2)网络

leetcode做题笔记147. 对链表进行插入排序

给定单个链表的头head,使用插入排序对链表进行排序,并返回排序后链表的头。插入排序算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。下面是插入排序算法的

免费可源可商用的BI工具对比(支持Doris 数据库)

目前市面上有很多开源的BI工具可供选择,以下是几个免费、开源且可以商用的BI工具,并且支持和Doris数据库结合使用:Superset:由Airbnb发起的开源BI工具,带有可视化和交互式仪表盘功能。Superset支持多种数据源,其中包括Doris数据库。Metabase:一个简单易用的BI工具,支持数据可视化和SQ

热文推荐