🌞🌞変数aに格納されている数値データと変数bに格納されている数値データを交換するswap関数を作製してみよう その2
#include <stdio.h>
void swap(int* pa, int* pb){
int c;
c=*pa;
*pa=*pb;
*pb=c;
}
int main(void){
int a=1;
int b=2;
printf("変数aに格納されている数値データは%dです\n",a);
printf("変数bに格納されている数値データは%dです\n",b);
swap(&a, &b);
printf("変数aに格納されている数値データは%dです\n",a);
printf("変数bに格納されている数値データは%dです\n",b);
return 0;
}
プログラムの実行結果
(EAZY IDECの場合)
変数aに格納されている数値データは1です
変数bに格納されている数値データは2です
変数aに格納されている数値データは2です
変数bに格納されている数値データは1です
プログラムの実行結果
(Visual studioの場合)
変数aに格納されている数値データは1です
変数bに格納されている数値データは2です
変数aに格納されている数値データは2です
変数bに格納されている数値データは1です
ソーラー「自作関数swapの定義をご覧ください。」
void swap(int* pa, int* pb){
int c;
c=*pa;
*pa=*pb;
*pb=c;
}
ソーラー「このとき
int* paによって生成されるポインタ変数
paには変数aのアドレス&aが代入されているので
*paは
変数aのアドレス&aのメモリに格納されている数値データを
あらわしており
かつ
*paを用いれば
変数aのアドレス&aのメモリにアクセスして
変数aのアドレス&aのメモリに格納されている数値データを
変更することができます。
つまり
*paは変数aと等しい働きをします
同様に
int* pbによって生成されるポインタ変数pbは
変数bのアドレス&bが代入されているので
*pb
は
変数bのアドレス&bのメモリに格納されている数値データを
あらわしており
かつ
*pbを用いれば
変数bのアドレス&bのメモリにアクセスして
変数bのアドレス&bのメモリに格納されている数値データを
変更することができます
つまり
*pbは変数bと等しい働きをします
そこで再び
自作関数swapの定義に戻ってみます
void swap(int* pa, int* pb){
int c;
c=*pa;
*pa=*pb;
*pb=c;
}
👆
このように定義された自作関数swapが実行されると
int c;
c=*pa;
*pa=*pb;
*pb=c;
が実行されることになります。
main関数内では
int a=1;
int b=2;
swap(&a, &b);
と記述されているので
void swap(int* pa, int* pb)
の
int* paによって生成されるポインタ変数paには
pa=&a;
と変数aのアドレス&aが
int* pbによって生成されるポインタ変数pbには
pb=&b;
と変数bのアドレス&bが
与えられることになります
すると
*paは変数aに等しい働きをし
*pbは変数bに等しい働きをすることになります。
その状態で
int c;
c=*pa;
*pa=*pb;
*pb=c;
が実行されると
まず
変数宣言int c;
によって作製された変数cに
c=*pa;
と
*paが代入されることになります
*paは変数aに等しい働きをするので
変数aは数値データ1を格納しているこの場合
*paも数値データ1を格納することになります
すると
c=*pa;
は
c=1;
が行われていることと等しくなり
変数cは1の値をもちます。
次に
*pa=*pb;
が実行されます。
*pbは変数bに等しい働きをするので
変数bは数値データ2を格納しているので
*pbも数値データ2を格納することになります。
すると
*pa=*pb;
は
*pa=2;
が行われていることと等しくなります。
よって
*paは2の値を持つことになります。
そして
*pb=c;
が実行されると
変数cは1の値を持っているので
*pb=1;
が行われていることと等しくなり
*pbは1の値を持ちます。
つまり
自作関数swapが実行されると
c=1
*pa=2
*pb=1
の数値データをもつことになります。
*paは変数aに等しい働きをするので
*paが2の値をもつなら
aも2の値をもち
*pbは変数bに等しい働きをするので
*pbが2の値をもつなら
bも2の値をもつことになります
つまり
変数aに格納されている数値データは2
変数bに格納されている数値データは1
となります。
*pa=2;
*pb=1;
の
*pa
は
変数aのアドレス&aの付いたメモリに直接アクセスするので
*pa=2;
が実行されると
変数aに格納されている数値データは2となります。
同様に
*pb
は
変数bのアドレス&bの付いたメモリに直接アクセスするので
*pb=1;
が実行されると
変数bに格納されている数値データは1となります。
よって
自作関数swapが実行されると
main関数内で変数宣言された
変数aに格納されている数値データは1
変数bに格納されている数値データは2
となっている状態から
変数aに格納されている数値データは2
変数bに格納されている数値データは1
と
格納している数値データが交換されるんだね。」
アレサ「
int c;
c=*pa;
*pa=*pb;
*pb=c;
においては
c=*pa;
を実行して
*paに格納されている数値データ1を
変数cに渡しておいて
最後に
*pb=c;
と
*pbに数値データ1をわたしています。
なぜ
int c;
c=*pa;
*pa=*pb;
*pb=*pa;
でなく
int c;
c=*pa;
*pa=*pb;
*pb=c;//👈ここに注目💖
が実行されたのかというと
*pa=*pb;
が実行されると
*paに格納されている数値データは1から2となるので
*pb=*pa;
を実行して
*pbに*paを使って数値データ1が代入できなくなるからですの
そのため
先に変数cに
*paに格納されている数値データ1を
渡しておくというわけですね。
そして
最後に
*pb=c;
と
*pbに数値データ1をわたすことにしているというわけです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます