在 C++中,引用和指针的区别

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
  1. 概念定义

    • 指针
      • 指针是一个变量,其存储的值是另一个变量的内存地址。例如,int *p;声明了一个名为p的指针,它可以指向一个int类型的变量。通过&运算符可以获取变量的地址,例如int a = 10; int *p = &a;,这里p就指向了变量a
    • 引用
      • 引用是一个别名,它是一个变量的另一个名字。在声明引用时,必须同时初始化它,并且之后不能再让它引用其他变量。例如,int a = 10; int &r = a;r就是a的引用,对r的操作就是对a的操作。
  2. 内存分配

    • 指针
      • 指针本身需要占用内存空间来存储它所指向变量的地址。在32位系统中,指针变量通常占用4个字节,在64位系统中通常占用8个字节。例如,int *p;这个指针变量本身在内存中有自己的存储位置,大小为上述系统对应的字节数。
    • 引用
      • 引用不占用额外的内存空间(从用户角度看)。引用只是变量的别名,它和被引用的变量共享相同的内存地址,编译器会在内部进行处理,使得对引用的操作直接作用于被引用的变量。
  3. 初始化要求

    • 指针
      • 指针可以先声明,然后在后续的代码中再进行初始化。例如:
        int *p;
        int a = 10;
        p = &a;
        
      • 也可以在声明时初始化,如int a = 10; int *p = &a;。而且指针还可以被赋值为nullptr(C++ 11引入)来表示它不指向任何有效的内存地址,例如int *p = nullptr;
    • 引用
      • 引用必须在声明时就进行初始化,并且一旦初始化后就不能再引用其他变量。例如:
        int a = 10;
        int &r = a;
        // 以下代码是错误的,不能让r再引用其他变量
        // int b = 20;
        // r = b;
        
  4. 使用语法和操作方式

    • 指针
      • 使用指针访问所指向的变量需要使用解引用运算符*。例如,int a = 10; int *p = &a; *p = 20;,这里*p就是解引用p,使得可以修改p所指向的变量a的值。
      • 指针可以进行算术运算(在数组操作中比较常见)。例如,对于一个指向数组元素的指针,可以通过指针加1来指向下一个数组元素。如果int arr[]={1,2,3}; int *p = &arr[0]; p++;此时p就指向了arr[1]
    • 引用
      • 引用的使用就像使用普通变量一样,不需要额外的运算符。例如,int a = 10; int &r = a; r = 20;这里直接对r进行操作就等同于对a进行操作。
      • 引用不能进行像指针那样的算术运算,因为它不是存储地址的变量,而是一个别名。
  5. 作为函数参数的区别

    • 指针
      • 当指针作为函数参数时,可以通过传递nullptr来表示一种特殊情况。例如:
        void func(int *p) {
                 
            if (p == nullptr) {
                 
                // 处理指针为空的情况
            } else {
                 
                // 正常处理
            }
        }
        
      • 函数内部可以通过修改指针的值来改变它所指向的对象。例如,在动态内存分配函数中,指针参数可以被重新赋值来指向新分配的内存块。
    • 引用
      • 引用作为函数参数时,函数内部对引用的操作就是对实参本身的操作。而且引用参数在函数调用时必须提供合法的变量作为实参,不能传递类似nullptr这样的值,因为引用不能为空。例如:
        void func(int &r) {
                 
            r++;
        }
        int main() {
                 
            int a = 10;
            func(a);
            // 此时a的值变为11
            return 0;
        }
        
相关文章
|
23天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
46 10
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
33 1
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
25 2
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
2月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
36 3
|
1月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
17 0
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`->`运算符,可以方便地访问和操作智能指针所指向的对象。