[C++] Explicación detallada de la referencia de C++ ④ (La función devuelve la referencia/puntero de la variable estática/variable global)





1. La función devuelve una referencia/puntero a una variable estática/variable global




1. No tiene sentido que una función devuelva una referencia o puntero a una variable local


El blog anterior [C++] Explicación detallada de la referencia de C++ ③ (El valor de retorno de una función no puede ser una referencia o un puntero de una "variable local" | No tiene sentido utilizar una referencia o un puntero de una "variable local" en una función como un valor de retorno de la función) y sacar las siguientes conclusiones :

Cuando el valor de retorno de una función es una referencia o un puntero a una "variable local", no tiene sentido;

Una vez ejecutada la función, la memoria de pila correspondiente a la función se reciclará y la dirección de la variable local correspondiente no tendrá significado.

En este momento, mantenga una referencia/puntero sin sentido devuelto por la función y el valor extraído es un valor aleatorio sin sentido;


2. La función devuelve una referencia o puntero a una variable estática/variable global


Es posible cuando la función devuelve una referencia/puntero de "variable estática" o "variable global";


Si el valor de retorno de la función es una referencia a una variable estática o una variable global,

Una vez que se asigna memoria para estas dos variables, la memoria no se recuperará durante todo el ciclo de vida del programa.

Devuelva sus referencias/punteros y normalmente podrá acceder a los datos en la memoria correspondiente;


3. Ejemplo de código: la función devuelve una referencia o un puntero a una variable estática/variable global


En el siguiente código,

La función divertida se utiliza como referencia y devuelve variables estáticas ordinarias;

La función fun2 devuelve una referencia a la variable estática;

El ciclo de vida de las variables estáticas de las dos funciones anteriores es el mismo que el ciclo de vida del programa, y ​​​​la memoria de estas dos variables estáticas se reciclará solo cuando finalice el programa;

Utilice la referencia para recibir la referencia devuelta por la función fun2 y obtenga la dirección de referencia de la variable estática. La memoria correspondiente a la referencia siempre es válida, por lo que a través de esta referencia se puede obtener el valor correcto de la variable estática en la memoria. ;


Ejemplo de código:

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

#include <stdio.h>

// 返回静态变量
int fun()
{
    
    
    static int a = 10;
    return a;
}

// 返回引用
int& fun2()
{
    
    
    static int a = 20;
    return a;
}

int main() {
    
    

    // 使用普通变量接收变量返回值
    int a1 = fun();

    // 使用普通变量接收引用返回值
    int a2 = fun2();

    // 使用引用接收 引用返回值
    int& a3 = fun2();

    // 混淆栈内存选项
    int a4 = fun();

    // 打印上述返回结果
    printf("a1 = %d , a2 = %d , a3 = %d , a4 = %d\n", a1, a2, a3, a4);

    return 0;
}

Resultados de:

a1 = 10 , a2 = 20 , a3 = 20 , a4 = 10

Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 13496)已退出,代码为 0
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

inserte la descripción de la imagen aquí

Guess you like

Origin blog.csdn.net/han1202012/article/details/132502239