自作関数の引数に設定された参照変数bにmain関数内で定義された変数aを代入すると変数aに格納されているデータは自作関数の操作をうけるようになります

ソーラー「みんな 値渡しというものを覚えているかな?


          

            値渡しとは


例えば


次のように


自作関数newfunctionが定義されているとします。

👇

void newfunction(int b) {


b = b + 1;


}


このとき


自作関数newfunctionの引数に設定されているint型の変数bに


main関数で変数宣言され、数値1が代入されたint型の変数a


を代入して


自作関数


newfunction(a);


が実行されても


つまり


b=b+1;


が実行されても


main関数で変数宣言されたint型の変数aに格納されている数値1だけが


自作関数newfunctionの引数に設定されているint型の変数bに渡されているので


変数aは自作関数の影響を受けず


変数aに格納されている数値1は1のまま変更されないというものでした


a=a+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

1


ソーラー「


今度は


自作関数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=b+1;


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


int&型の参照変数bに


int型の変数aが代入されると


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


a=a+1;


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


ですので


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


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


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


そのことが


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


の実行結果が


2


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


ソーラー「そういえば


自作関数newfunctionの引数にポインタ変数をつかって


ポインタ変数に


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


変数aのアドレス&aを代入して


自作関数newfunctionを実行し


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


変数aに格納されている数値を


1から2に変化させる方法があったね。



え~と


その場合は


自作関数newfunctionの定義を


void newfunction(int* ptb) {

*ptb =*ptb + 1;


}


として


次のようなプログラムを実行すればよかったかな?」


#include <stdio.h>


void newfunction(int* ptb) {


*ptb = *ptb + 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);


が実行されます


つまり


*ptb = *ptb + 1;


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


このとき


自作関数newfunctionの引数となっているポインタ変数ptbには


変数aのアドレス&aが代入されているので


*ptb は変数aのアドレスの付いたメモリにアクセスすることになります


つまり


*ptbには数値1が格納されていることになります


*ptb = *ptb + 1;


が実行されると


*ptbには数値2が格納されていることになります


つまり


変数aのアドレスの付いたメモリには


2



格納されることになります。


つまり


変数aには2が格納されることになるってわけだね


そのことが


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


の実行結果が


2


となっていることから確認できるね



このように


自作関数の引数となっているポインタ変数に


main関数内で変数宣言された変数のアドレスを代入することを


          ポインタ渡し


というのでしたね。」






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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