🌞🌞変数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です



ソーラー「自作関数の定義をご覧ください。」


void swap(int*pa, int*pb){


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


ソーラー「このとき


int*paによって生成されるポインタ変数


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


*paは


変数aのアドレス&aのメモリに格納されている数値データを


あらわしており


かつ


変数aのアドレス&aのメモリにアクセスして


変数aのアドレス&aのメモリに格納されている数値データを


変更することができます。


つまり


*paは変数aと等しい働きをします



同様に


int*pbによって生成されるポインタ変数pbは


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


*pb

は


変数bのアドレス&bのメモリに格納されている数値データを


あらわしており


かつ


変数bのアドレス&bのメモリにアクセスして


変数bのアドレス&bのメモリに格納されている数値データを


変更することができます


つまり


*pbは変数bと等しい働きをします



そこで再び


自作関数の定義に戻ってみます


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=2;

は

a=2;

に等しく


*pb=1;

は

b=1;


に等しいので



変数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をわたしています。


そうしなければ


*pa=*pb;


が実行されると


*paに格納されている数値データ1から2となるので


*pbに*paを使って数値データ1が代入できなくなるというわけです


そのため


先に変数cに


*paに格納されている数値データ1を


渡しておくというわけですね。」












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

作者を応援しよう!

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

応援したユーザー

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