首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++面试基础系列-指针和引用

  • 25-02-19 04:42
  • 3668
  • 13311
blog.csdn.net

系列文章目录

总目录链接


文章目录

  • 系列文章目录
    • 总目录链接
  • C++面试基础系列-指针和引用
    • Overview
    • 1.指针和引用含义
      • 1.1.指针(Pointer)
      • 1.2.引用(Reference)
      • 1.3.指针和引用一起使用
      • 1.4.指针引用(Pointer to Reference)
      • 1.5.注意事项
    • 2.指针和引用的区别
    • 3.指针和引用使用方法
    • 关于作者


C++面试基础系列-指针和引用

Overview

1.指针和引用含义

在C++中,“pointer reference"这个术语可能引起一些混淆,因为"reference”(引用)和"pointer"(指针)是两种不同的概念,但它们可以一起使用。以下是对这两种概念的解释和它们如何一起使用的示例:

1.1.指针(Pointer)

指针是一个变量,它存储了另一个变量的内存地址。指针允许你间接访问内存地址上存储的值。

int value = 10;
int* pointer = &value; // 'pointer'是指向'value'的指针
  • 1
  • 2

1.2.引用(Reference)

引用是一个别名,为一个已存在的变量提供了另一个名字。一旦引用被初始化,它就不能重新绑定到另一个变量。

int value = 10;
int& reference = value; // 'reference'是'value'的引用
  • 1
  • 2

1.3.指针和引用一起使用

你可以有一个指针到引用,这通常在函数参数中看到,以便传递一个对对象的引用而不是对象本身,同时还能保持指针的语义。

void increment(int& ref) {
    ref += 1;
}

void process(int* ptr) {
    increment(*ptr); // 通过指针传递引用
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这个例子中,increment 函数接受一个引用作为参数。在 process 函数中,我们有一个指向 value 的指针 ptr。我们通过 *ptr(解引用指针以获取它所指向的值)来调用 increment,这样 increment 就可以修改 value 的原始值。

1.4.指针引用(Pointer to Reference)

虽然不常见,但你可以有一个指向引用的指针。这通常在复杂的数据结构或模板元编程中看到。

int value = 10;
int& ref = value;
int*& refRef = ref; // 'refRef'是指向引用的引用,也指向'value'
  • 1
  • 2
  • 3

在这个例子中,refRef 是一个引用到引用的指针。它首先声明为 ref 的引用,然后可以被当作一个指向 value 的指针使用。

1.5.注意事项

  • 引用必须在声明时被初始化,并且不能是nullptr。
  • 指针可以是nullptr,表示它不指向任何地址。
  • 引用的引用(或指向引用的指针)在大多数情况下是不推荐的,因为它可能导致代码难以理解和维护。

在实际编程中,通常建议使用常规的引用或指针,因为它们已经能够满足大多数需求,而且更易于理解和使用。

2.指针和引用的区别

指针(Pointer)和引用(Reference)在C++中是两种不同的概念,它们在使用和行为上有着明显的区别:

  1. 定义方式:

    • 指针是一个变量,它存储了另一个变量的内存地址。

      int a = 10;
      int* p = &a; // p是指向a的指针
      
      • 1
      • 2
    • 引用是某个已存在变量的别名。

      int a = 10;
      int& r = a; // r是a的引用
      
      • 1
      • 2
  2. 初始化:

    • 指针可以在任何时候被初始化或重新指向另一个地址。
    • 引用必须在声明时立即初始化,且一旦初始化后,就不能再指向另一个变量。
  3. 可修改性:

    • 指针可以在任何时间指向nullptr或被重新赋值为其他地址。
    • 引用不能是nullptr,且一旦引用绑定到一个对象,就不能被修改为引用其他对象。
  4. 语法使用:

    • 通过指针访问其指向的值需要使用解引用操作符*。
    • 引用使用起来就像使用原始变量一样,没有特别的语法需求。
  5. 内存分配:

    • 指针可能涉及到动态内存分配(使用new和delete)。
    • 引用不涉及动态内存分配,它们只是现有变量的别名。
  6. 类型转换:

    • 指针可以进行类型转换,如从void*转换为具体类型指针。
    • 引用通常不进行类型转换,它们在声明时类型就固定了。
  7. 数组和函数参数:

    • 指针可以用于数组和作为函数参数,以实现更复杂的数据操作。
    • 引用通常用于函数参数,以提供对实际参数的直接修改能力,避免复制开销。
  8. 内存占用:

    • 指针变量本身占用内存,它们存储的是另一个变量的地址。
    • 引用不占用额外内存,它们不存储地址,只是现有变量的一个别名。
  9. 安全性:

    • 指针可能更容易出错,如野指针、内存泄漏等。
    • 引用由于其绑定的特性,使用起来更安全,不容易出现错误。
  10. 与const结合使用:

    • 可以有指向const的指针(指向常量的指针),这意味着不能通过这个指针修改其指向的值。
    • 引用可以是const的,表示不能通过引用修改原始变量的值。

在实际编程中,选择使用指针还是引用通常取决于具体的应用场景和需求。引用通常用于简化代码和提高可读性,而指针则提供了更多的灵活性和控制能力。

3.指针和引用使用方法

以下是一个简单的C++代码示例,展示了指针和引用的使用:

#include 

void usePointer(int* ptr) {
    if (ptr != nullptr) {
        std::cout << "Using pointer: " << *ptr << std::endl;
        *ptr = 20; // 修改指针指向的值
    }
}

void useReference(int& ref) {
    std::cout << "Using reference: " << ref << std::endl;
    ref = 30; // 修改引用绑定的值
}

int main() {
    int value = 10;

    // 使用指针
    std::cout << "Original value: " << value << std::endl;
    usePointer(&value);
    std::cout << "Value after pointer function: " << value << std::endl;
    std::cout << std::endl;

    // 使用引用
    std::cout << "Original value: " << value << std::endl;
    useReference(value);
    std::cout << "Value after reference function: " << value << std::endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在这个示例中:

  • usePointer 函数接受一个int*类型的参数,即指向int的指针。在函数内部,我们首先检查指针是否不为nullptr,然后通过解引用操作符*来访问和修改指针指向的值。

  • useReference 函数接受一个int&类型的参数,即int的引用。在函数内部,我们直接使用引用来访问和修改它绑定的原始变量的值。

  • 在main函数中,我们声明了一个int类型的变量value并初始化为10。然后分别使用指针和引用的方式调用函数,并观察变量值的变化。

这个示例展示了指针和引用在函数参数传递中的使用,以及它们如何影响原始变量的值。请注意,引用在函数内部被当作原始变量的别名来使用,而指针则需要通过解引用来访问其指向的值。

关于作者

  • 微信公众号:WeSiGJ
  • GitHub:https://github.com/wesigj/cplusplusboys
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
WeSiGJ
微信公众号
共同分享,共同交流, 共同学习!
注:本文转载自blog.csdn.net的WeSiGJ的文章"https://blog.csdn.net/wesigj/article/details/141552760"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top