Directorio de artículos
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
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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .