【C++】C++リファレンス詳細解説④(静的変数/グローバル変数の参照/ポインタを返す関数)





1. 関数は静的変数/グローバル変数への参照/ポインタを返します。




1. 関数がローカル変数参照またはポインタを返すことは無意味です


前回のブログ【C++】C++リファレンス詳細解説③(関数の戻り値を「ローカル変数」の参照やポインタにすることはできない | 関数内で「ローカル変数」の参照やポインタを使っても意味がない)関数の戻り値)、次の結論を導き出します

関数の戻り値が「ローカル変数」への参照またはポインタである場合、それは無意味です。

関数実行後は、関数に対応するスタックメモリが再利用され、対応するローカル変数アドレスは意味を持ちません。

このとき、関数が返す無意味な参照/ポインタを保持し、取り出される値はランダムな意味のない値になります。


2. 関数は静的変数/グローバル変数への参照またはポインタを返します。


関数が「静的変数」または「グローバル変数」の参照/ポインタを返す場合は可能です。


関数の戻り値が静的変数またはグローバル変数への参照である場合、

これら 2 つの変数にメモリが割り当てられると、プログラムのライフ サイクル全体にわたってメモリは再利用されません。

それらの参照/ポインタを返すと、通常は対応するメモリ内のデータにアクセスできます。


3. コード例 - 関数は静的変数/グローバル変数への参照またはポインターを返します。


以下のコードでは、

fun 関数は参照として使用され、通常の静的変数を返します。

fun2 関数は静的変数への参照を返します。

上記 2 つの関数の静的変数のライフ サイクルはプログラムのライフ サイクルと同じであり、これら 2 つの静的変数のメモリはプログラムの終了時にのみリサイクルされます。

fun2関数が返すリファレンスをリファレンスで受け取り、スタティック変数のリファレンスアドレスを取得しますリファレンスに対応するメモリは常に有効なので、このリファレンスを通じてメモリ上のスタティック変数の正しい値を取得できます;


コード例:

// 导入标准 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;
}

の結果:

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

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

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/han1202012/article/details/132502239