C++ 指针与引用详解

Posted 余识-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 指针与引用详解相关的知识,希望对你有一定的参考价值。

文章目录


1. 引言

对C++学习感兴趣的可以看看这篇文章哦:C/C++教程

在C++编程中,引用和指针是常见的概念。它们都可以用来操作内存地址,但是又有一些区别。本文将介绍引用和指针的概念、原理、区别、常见用法以及注意事项。

2. 引用的概念和原理

引用是C++中的一个重要的特性,它是一个已存在变量的别名。换句话说,引用就是变量的一个别名,通过使用引用可以方便地操作变量,同时也不会产生额外的内存开销。

引用的定义格式如下:

type &ref = var;

其中,type表示引用所引用的变量类型,&表示取地址符,ref表示引用变量名称,var表示被引用的变量。

引用的原理是通过地址引用来实现的。在程序运行过程中,引用实际上是指向被引用变量的地址,对引用的修改会直接反映到被引用变量上。

3. 指针的概念和原理

指针是C++中的另一种重要的概念,它是一个变量,用于存储其他变量的地址。与引用不同的是,指针的值可以改变,同时也需要关注指针所指向的内存是否已经被释放。

指针的定义格式如下:

type *ptr = &var;

其中,type表示指针所指向的变量类型,*表示指针类型,ptr表示指针变量名称,&var表示被指向的变量地址。

指针的原理是通过地址访问来实现的。指针存储的是指向被指向变量的地址,可以通过解引用操作符*来获取指针所指向的变量值。同时,也可以通过&符号获取指针的地址。

4. 引用和指针的区别

虽然引用和指针都可以用来操作内存地址,但是它们还是有一些区别的,主要表现在以下几个方面:

  1. 定义方式不同:引用是一个已存在变量的别名,指针是一个变量,用于存储其他变量的地址。
  2. 是否需要初始化:引用必须在定义时进行初始化,而指针可以先不初始化。
  3. 是否可以改变引用或指针本身的值:引用一旦初始化后,就不能再改变其所绑定的变量;而指针可以通过赋值操作改变指向的变量地址。
  4. 是否可以使用空值:引用必须绑定到一个已经存在的变量上,而指针可以存储空值nullptr。
  5. 是否需要解引用:引用不需要解引用,直接使用即可;而指针需要使用解引用操作符*才能获取指向的变量值。
  6. 是否可以进行运算:指针可以进行加减等运算,而引用不支持运算。

5. 引用和指针的常见用法

在C++编程中,引用和指针都有一些常见的用法。

5.1. 引用的常见用法

  1. 函数传参:通过引用传递参数,不仅可以避免复制大对象,还可以方便地修改实参的值。
void func(int &a, int &b) 
    // ...

  1. 返回值:函数可以返回一个引用来代表某个变量的别名,可以避免拷贝大对象。
int &func() 
    // ...

  1. 循环遍历:当需要循环遍历容器或

  2. 数组时,使用引用可以避免拷贝容器或数组元素。

    for(auto &item : container) 
        // ...
    
    

    5.2. 指针的常见用法

    1. 动态内存分配:使用指针可以动态地分配内存,如new和delete操作符。
    int *ptr = new int; // 动态分配一个整数空间
    delete ptr; // 释放内存
    
    1. 函数传参:指针可以通过地址传递参数,在函数内修改实参的值。
    void func(int *a, int *b) 
        // ...
    
    
    1. 返回值:函数可以返回一个指针来代表某个变量的地址。
    int *func() 
        // ...
    
    
    1. 数组访问:使用指针可以遍历数组或者访问数组中的元素。
    int arr[10] = 0;
    int *ptr = arr;
    for(int i = 0; i < 10; i++) 
        cout << *(ptr + i) << endl;
    
    

    6. 注意事项

    在使用引用和指针时,需要注意以下几点:

    1. 引用必须初始化,否则会导致编译错误。
    2. 指针可能为空,使用前需要进行有效性检查。
    3. 注意指针所指向的内存是否已经被释放,如果未被释放再次访问会导致程序崩溃。
    4. 避免多级指针的使用,容易导致代码难以阅读和理解。
    5. 应该尽量避免使用裸指针(raw pointer),而是使用智能指针(smart pointer)等RAII机制来管理内存。

    7. 总结

    引用和指针是C++中两个常见的概念。它们都可以用来操作内存地址,但是有一些区别。在编程时需要根据实际情况选择合适的方式。同时,在使用引用和指针时也需要注意安全问题,避免引发程序崩溃或者内存泄漏等问题。

C++ 值传递指针传递引用传递详解

具体内容源自:
http://www.cnblogs.com/yanlingyin/archive/2011/12/07/2278961.html

以下是简介:

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:

形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过
栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

以上是关于C++ 指针与引用详解的主要内容,如果未能解决你的问题,请参考以下文章

c++的引用与指针的关系详解

C++之引用&的详解

C++ 值传递指针传递引用传递详解

C++原生指针,引用与智能指针

c++使用裸指针与智能指针返回数组详解

C++ Boost 智能指针详解