自作関数の引数に参照変数が用いられていると変数が代入されるごとに参照変数は代入された変数そのものを表すことになります

ソーラー「


int 型の変数宣言


int a;

を実行し


a=1;


と数値データを代入したとします


このとき


int& b = a;


のように


bの参照変数宣言、初期化を変数aを用いて行うと


参照変数bは変数aそのものを表すことになります


つまり


参照変数bは変数aの管理しているメモリにアクセスすることになるわけですが


この


💖参照変数bは💖


参照変数bが


🌞初期化されたときに用いられた変数aの管理しているメモリに🌞



     💖アクセスしつづけることになるのでしたね 💖


このあと


参照変数bに別のint型の変数cを代入したとしても


変数cの格納している値だけが


参照変数bに代入されるだけで


            いいかえると


変数cの格納している値だけが


値渡しされるだけで


参照変数bは変数cそのものをあらわすことになりません


つまり


参照変数bは


変数cの管理しているメモリにアクセスすることにはなりません




💖参照変数bは💖


参照変数bが


       🌞初期化されたときに用いられた🌞


       🌞変数aの管理しているメモリに🌞



        💖アクセスしつづけることになる💖



というのがポイントなんだよ




次に


自作関数newfunctionの引数にint& bを設定して


main関数内で変数宣言された変数aを


参照変数bに代入して


自作関数newfunctionを実行してみたいと思います。


自作関数newfunctionの定義は


void newfunction(int& b) {


b = b + 1;


}


とします


その時のプログラムはこちらです

👇

#include <stdio.h>


void newfunction(int& b) {


b = b + 1;


}



int main(void) {


int a;


a = 1;


printf("%d\n",a);



newfunction(a);


printf("%d\n",a);


return 0;

}


ビルド実行結果


1

2


アレサ「ソーラーさん このプログラムでは


何が行われているのですか?」


ソーラー「このプログラムでは


int a;


a = 1;


printf("%d\n",a);


により


コマンドプロンプト画面に


1


が表示されています


このとき


変数aには1が代入されています。


そして


newfunction(a);


が実行されると


参照変数bは変数aによって



          🌞初期化🌞



されたことになります


b=b+1;


が実行されることになるのですが


int&型の参照変数bが


int型の変数aによって初期化されると


参照変数bは変数aを表すことになるので


a=a+1;


が実行されることになります


ですので


変数aに格納されている数値データは


自作関数newfunctionの影響を受けて


1から2に変化しているというわけなんだね。


そのことが


printf("%d\n",a);



の実行結果が


2


になっていることからもわかるね。


このとき


参照変数bは変数aの管理しているメモリ領域にアクセスしていますが


自作関数の実行の終了にともない


参照変数bはメモリから消去され


参照変数bが変数aの管理しているメモリ領域にアクセスすることはなくなります


次に


cのint型の変数宣言


int c;

を行い


作製された変数cに


c = 10;



数値データ10を代入します


そして


自作関数newfunctionの引数となっている参照変数bに変数cを代入して


newfunction(c);


を実行すると


参照変数bは変数cによって



          🌞初期化🌞


され


参照変数bは変数cそのものを表すことになります


つまり


参照変数bは変数cの管理しているメモリ領域にアクセスすることになります


そして


newfunction(c);


が実行されると


b=b+1;


が実行されることになるのですが


int&型の参照変数bに


int型の変数cによって初期化されると


参照変数bは変数cそのものを表すことになるので


c=c+1;


が実行されることになります


ですので


変数cに格納されている数値データは


自作関数newfunctionの影響を受けて


10から11に変化することになります


(そして、この場合も


自作関数


newfunction(c);


の実行の終了にともない


参照変数bはメモリから消去され


参照変数bが変数cの管理しているメモリ領域にアクセスすることはなくなります


solarplexussより )


そのことを示すプログラムはこちらです

👇


#include <stdio.h>


void newfunction(int& b) {


b = b + 1;


}



int main(void) {


int a;


a = 1;


printf("%d\n", a);



newfunction(a);


printf("%d\n", a);



int c;


c = 10;


printf("%d\n", c);



newfunction(c);


printf("%d\n", c);



return 0;

}



ビルド実行結果


1

2

10

11



ソーラー「


自作関数の引数に参照変数が用いられていると


引数となっている参照変数に変数が代入され


自作関数が実行されるごとに


参照変数はその変数によって初期化されたことになるんだね


そのとき


参照変数は


代入された変数そのものを表すことになります


ですが


自作関数の実行の終了とともに


参照変数はメモリから消去され


参照変数は代入された変数の管理しているメモリ領域にアクセスすることはなくなります



つまり




参照変数が自作関数の引数に設定されていると


自作関数の実行において


参照変数に新たな変数が代入され初期化されるたびに


参照変数は


代入された変数の管理しているメモリ領域にアクセスすることになるってわけなんだね😊」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る