首页 > 编程语言 >【C++】C++ 引用详解 ⑦ ( 指针的引用 )

【C++】C++ 引用详解 ⑦ ( 指针的引用 )

时间:2023-09-07 15:37:40浏览次数:31  
标签:二级 函数 int C++ 详解 引用 Student 指针



文章目录

  • 一、二级指针可实现的效果
  • 二、指针的引用
  • 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) {  
    //...  
}






二、指针的引用




1、指针的引用 等同于 二级指针 ( 重点概念 )



普通变量的 引用 , 调用时可以直接当做 普通变量 使用 , 可实现的功能 相当于 一级指针 ;

  • 普通变量 相当于 零级指针 ;

一级指针的 引用 , 调用时可以直接当做 一级指针 使用 , 可实现的功能 相当于 二级指针 ;

N 级指针的 引用 , 调用时可以直接当做 N 级指针 使用 , 可实现的功能 相当于 N + 1 级指针 ;



在 C++ 语言 中 ,自动 在 一级指针 变量 旁边加上 取地址符号 & 和 取值符号 * ;

指针的引用 就相当于 二级指针 , 其 实现的效果 , 等同于 二级指针 ;

C++ 编译器 遇到 指针的引用 时 , 会自动将 引用指针 转为 二级指针 ;




2、引用本质 - 函数间接赋值简化版本



使用函数进行间接赋值 , 需要满足如下三个条件 :

  • 函数中定义 指针类型 的 形参 , 调用函数时 修改函数外的 实参 ;
  • 将 实参 取地址 , 传递给 函数 ;
  • 在函数中 , 通过指针修改 实参的值 , 以达到修改外部变量的效果 ;


如果将 函数 的形参类型 设置为 引用 类型 , 也能达到 间接赋值 的效果 ;

引用 实际上是 把 间接赋值 的三个条件的后两个条件进行了合并 , 还是需要将 引用 还原为 C 语言中的 取地址 传入函数 , 在函数内部使用指针访问实参 ;



3、代码示例 - 指针的引用



该 函数 的 参数 是 一级指针的引用 , 使用该参数时 可以当做 一级指针使用 , 其效果 等同于 二级指针 ; 其效果等同于上一篇博客 【C++】C++ 引用详解 ⑥ ( 普通变量 / 一级指针 / 二级指针 做函数参数的作用 ) 中的 int getStudent(Student** stu) 函数 ;

// 参数是 一级指针的引用 
// 该参数 是 一级指针的引用 
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)

调用该 一级指针 的 引用 , 可以直接访问 一级指针 , 不需要使用 * 符号 ;

因此 这里 直接为 一级指针 进行内存分配 ;

如果此处是二级指针 , 需要先试用 * 符号 取出二级指针指向的一级指针 , 然后再为该 一级指针 分配内存 ;

// 为形参中声明的 Student* 指针的引用 分配内存
    // 一维指针的引用 相当于直接访问一维指针 
    // 相当于为 main 函数中的 Student* stu 变量赋值
    p = (Student*)malloc(sizeof(Student));
    // 如果传入的是二维指针参数 Student** p
    // 上述操作等同于
    // *p = (Student*)malloc(sizeof(Student));



代码示例 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

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

// 参数是 指针的引用 
// 该参数 是 一级指针的引用 
// 使用该参数时 可以当做 一级指针使用
// 其效果 等同于 二级指针
int getStudent(Student*& p)
{
    // 为形参中声明的 Student* 指针的引用 分配内存
    // 一维指针的引用 相当于直接访问一维指针 
    // 相当于为 main 函数中的 Student* stu 变量赋值
    p = (Student*)malloc(sizeof(Student));
    // 如果传入的是二维指针参数 Student** p
    // 上述操作等同于
    // *p = (Student*)malloc(sizeof(Student));

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

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

    // 执行成功
    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
请按任意键继续. . .

【C++】C++ 引用详解 ⑦ ( 指针的引用 )_C


标签:二级,函数,int,C++,详解,引用,Student,指针
From: https://blog.51cto.com/u_14202100/7397610

相关文章

  • 【C++】C++ 引用详解 ④ ( 函数返回 静态变量 / 全局变量 的 引用 / 指针 )
    文章目录一、函数返回静态变量/全局变量的引用/指针1、函数返回局部变量引用或指针无意义2、函数返回静态变量/全局变量的引用或指针3、代码示例-函数返回静态变量/全局变量的引用或指针一、函数返回静态变量/全局变量的引用/指针1、函数返回局部变量引用或指针......
  • 码流格式: Annex-B, AVCC(H.264)与HVCC(H.265), extradata详解(转)
    原文:http://www.taodudu.cc/news/show-6091235.html?action=onClick1.前言介绍H.264结构的文章铺天盖地,无责任翻译、无责任转载以及部分经验之谈(目前搜索最靠前的一篇实际是对stackoverflow上答案的翻译。。链接后面给出了),所以缺的不是资料,是叙述准确的资料。来吧,看这篇整理就够......
  • 一文搞定,PO设计模式详解
    PO模式:全称:pageobjece,分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复⽤性。PO模式的优势:1)效率⾼:同理,PO模式的逻辑层⽅法有具体定义,情况和元素发⽣变化⼀样修改逻辑层,业务层不变。这样看来结构简单清晰,舒服更符合⼈类习惯,普通⽅式就是继续堆case。2)复⽤多收益⼤:同样......
  • Uchardet C++源码编译步骤 文本编码检测命令行工具 Command line
    从官网 https://www.freedesktop.org/wiki/Software/uchardet/下载源码 https://www.freedesktop.org/software/uchardet/releases/=====================================================================================下载编译工具:Cmake和mingw64https://cmake.org......
  • cv2.error: Unknown C++ exception from OpenCV code.报错解决
    问题原因:opencv版本太高,python版本太低解决办法:打开opencv下载网站找到自己的python版本对应的opencv的版本,然后通过下面代码安装pipinstallopencv-python==4.1.2.30-ihttps://pypi.tuna.tsinghua.edu.cn/simple ......
  • HTTPS加密协议详解:HTTPS性能与优化
    1、HTTPS性能损耗前文讨论了HTTPS原理与优势:身份验证、信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价,HTTPS协议的性能损耗主要体现如下:(1).增加延时分析前面的握手过程,一次完整的握手至少需要两端依次来回两次通信,至......
  • 一些C++库的简要说明
    说明:1.**Boost**:提供了许多C++库,如Boost.Asio(网络和异步I/O)、Boost.Filesystem(文件系统操作)、Boost.Thread(多线程支持)、Boost.Serialization(序列化)等。用于增强C++的功能。2.**cpp2sky**:用于与SkyWalkingAPM系统集成的库,提供应用程序性能监视和分析功能。3.**cppzmq**:C++Z......
  • 04Java学习_DOS原理和路径详解
    DOS原理和路径详解DOS原理Dos:DiskOperatingSystem磁盘操作系统。路径详解相对路径:从当前目录开始定位,形成的一个路径。绝对路径:从顶级目录开始定位,形成的一个路径。..\表示到上一级目录。参考链接:DOS原理相对与绝对路径DOS常用命令查看当前目录有什么内容,......
  • 软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
    简介在数据库中,我们常常需要从表中筛选出符合特定条件的数据,以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询,使我们能够轻松地筛选数据。本文将详细介绍MySQLWHERE条件查询的用法和示例,帮助大家更好地理解和应用这一功能。WHERE条件查询的基本语法SELECT列1,列2,.......
  • HTTPS加密协议详解:TLS/SSL握手过程
    1、握手与密钥协商过程基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。(1).client_hello客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:支持的最高TSL协议版本version,从低到高依次SSLv2SS......