🌞🌞変数aに格納されている数値と変数bに格納されている数値を交換するswap関数を作製してみよう  その1

#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です



ソーラー「綺麗に


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


変数bに格納されている数値が入れ替わったね。」


アレサ「ソーラーさん


このプログラムでは何が行われているのでしょうか?」


ソーラー「このプログラムで何がおこなわれているか(´▽`*)


じっく~り


考察してみよ~


どこからとりかかろうかな~」


アレサ「ソーラーさん こういうの 本当に好きですの」


ソーラー「まあ じっくり 楽しんでいこうじゃないか



まずは


プログラムの冒頭の自作関数の定義


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


からみていこうかな」


アレサ「この自作関数は何を定義しているのでしょうか?」


ソーラー「この自作関数の定義で


変数aと変数bに格納されている数値を交換する


swap関数を作製しているんだ。


swapとは英語で交換という意味なんだ」


アレサ「変数aと変数bに格納されている数値を交換するのですか


たとえば


int a=1;

int b=2;

つまり

変数aに1

変数bに2と

格納されている数値が



      🐤 swap関数の実行後 🐤




変数aに2

変数bに1と

格納されるのですか?」


ソーラー「そう、そう、そうなんだ


いくら


変数aと変数bに格納されている数値を交換する方法は


前のエピソードでも見てきたけど



この場合は


自作関数swapを実行して


変数aと変数bに格納されている数値を交換しているんだ。


で

自作関数の定義が


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}

となっているね。


まず気付くのは


自作関数の引数に


int*pa

int*pb


が記述されていることだね。


paとpbのポインタ変数宣言がおこなわれているね。


ポインタ変数に代入できるのはアドレスやポインタ変数だから



自作関数swapを実行するには


main関数内で


swap(&a, &b);


のように記述されるのが予測されるね。


ここではポインタ変数pa,pbに


アドレス


&a

&b

が代入されているね。


さてさて


すこしだけ構造が読めてきたかな~


自作関数の定義をもう一度みてみる。


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


ソーラー「

swap関数は


swap(int*pa, int*pb)


のように


引数

を2つもっているか・・・


自作関数の引数が2個設定されているけど


みんな


そこは大丈夫かな?


自作関数の引数が2個設定されているということは


自作関数の定義のなかで


引数となっている変数が2つほど使用されるんだね。」



さて


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


が


何を意味しているかだよね」


アレサ「


void swap(int*pa, int*pb)


の


引数には


pa

と

pb

の


ポインタ変数宣言


int*pa

と

int*pb


がおこなわれています


つまり


ポインタ変数

pa

と

ポインタ変数

pb


が作製されています。」


ソーラー「そう、そう


ポインタ変数

pa

と

ポインタ変数

pb

が作製されているんだ


pa

と

pb

は

ポインタ変数だから


アドレスを格納することができるよね


main関数内で


swap(&a, &b);


と記述されているのをみても分かるように


ポインタ変数paにはアドレス&aが


ポインタ変数pbにはアドレス&bが


格納されているんだよ


pa=&a;

pb=&b;


という具合にだね。


ここで


pa=&a;

pb=&b;


に注目なんだよ。


ポインタ変数paにアドレス&aが


ポインタ変数pbにアドレス&bが


代入されるというこちは


*paはアドレス&aのメモリにアクセスして


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


あらわすことになるんだ。


つまり


*paは


変数aに格納されている数値を表すことになるんだ。


同様に


*pbはアドレス&bのメモリにアクセスして


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


あらわすことになるんだ。


つまり


*pbは


変数bに格納されている数値を表すことになるんだ。





                  つ・づ・く💖」


























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

作者を応援しよう!

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

応援したユーザー

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