チャックブログ

UnityやC#などをメインに公開していきます。C++も勉強始めました!

【C++】値渡し、ポインタ渡し、参照渡しについてと自分が陥った穴

注意

この記事はC++初心者がインプットしたものをアウトプットしたものなのでもしかしたら間違いがあるかもしれませんご了承ください。

値渡し

サンプルコード

void test(int num)
{
    num++;
    std::cout << num << std::endl;
}


int main()
{
    int value = 1;

    std::cout << value <<std::endl;

    test(value);

    std::cout << value << std::endl;
}

実行結果

1
2
1

値渡しとは引数で渡した物のコピーを作成してそのコピーに変更を加えています。
なので関数の呼び出し元となったvalueの値は変更されません。

ポインタ渡し

サンプルコード

void test(int *num)
{
    *num+=10;
    std::cout << *num << std::endl;
}


int main()
{
    int value = 1;

    std::cout << value <<std::endl;

    test(&value);

    std::cout << value << std::endl;
}

実行結果

1
11
11

ポインタ渡しは変数のアドレスを渡すのでアドレスに直接書き込むことができます。
関数の呼び出し元の変数にも変化を与えることが可能です。

参照渡し

サンプルコード

void test(int &num)
{
    num+=10;
    std::cout << num << std::endl;
}


int main()
{
    int value = 1;

    std::cout << value <<std::endl;

    test(value);

    std::cout << value << std::endl;
}

実行結果

1
11
11

こちらはポインタ渡しと同様にtest関数で値を変更した際関数呼び出し元の変数も変更されます。
この記法で記述すると関数内で別の変数のように扱えるのでC#を先に学んでいた身だとこっちの方がわかりやすかったです。

陥った穴

配列を値渡しした際のできごと… サンプルコード

void test(int num[])
{
    num[0] = 10;
    std::cout << num[0] << std::endl;
}


int main()
{
    int value[3] = {0,1,2};

    std::cout << value[0] <<std::endl;

    test(value);

    std::cout << value[0] << std::endl;
}

実行結果

0
10
10

あれ?値渡ししたのに0,10,0って結果にならない…
このように値渡しをしてるのになぜか関数呼び出し元の変数も変化している…なんでだろうと悩んでいました。
どうも配列を値渡しするとポインタ渡しになるようです…まじかぁ

終わり

C++難しいですが、一つ勉強になりました。