天国にいけるC言語入門 ヘキサ構造体 ver2.2126
自作関数の引数に設定された参照変数bにmain関数内で定義された変数aを代入すると変数aに格納されているデータは自作関数の操作をうけるようになります
自作関数の引数に設定された参照変数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関数内で変数宣言された変数のアドレスを代入することを
ポインタ渡し
というのでしたね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます