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

ソーラー「変数aに格納されている数値データと変数bに格納されている数値データを交換する・・・



そのプログラムは・・・



#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に格納されている数値データが入れ替わったね。」


アレサ「ソーラーさん


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


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


じっく~り


考察してみよ~


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


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


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


たしかにいきなりこのプログラムをみても何がなんだかわからないね。


まずは


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


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


からみていこうかな」


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


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


変数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に格納されている数値データを交換しているんだ。


自作関数swapの定義が


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}

となっているね。


まず気付くのは


自作関数swapの引数に


int* pa

int* pb


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


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


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



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


main関数内で


swap(&a, &b);


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


確かに


このプログラムでは


swap(&a, &b);


が実行されているね


swap(&a, &b);


が実行される場合は


自作関数swapの定義


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


int c;


c=*pa;

*pa=*pb;

*pb=c;


}


引数となっている


int* pa, int* pbに


アドレス


&a

&b

が代入されているんだ


その状態で


int c;


c=*pa;

*pa=*pb;

*pb=c;


が実行されているわけだ


さてさて


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


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


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に格納されている数値データを表すことになるんだ。


もっというなら


*paとaは同じアドレスのメモリにアクセスする変数であり


*pbとbは同じアドレスのメモリにアクセスする変数というわけなんだね







                  つ・づ・く💖」


























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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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