🌞🌞変数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をわたすことにしているというわけです」












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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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