TPY ENGINEERING VLOG

TPY ENGINEERING VLOG(C,JAVA)

*C言語* 〜31時限目〜 動作しない関数・・・

〜目次〜

 

 

動作しない関数

以下のswap( )という名前の関数を定義してから、

今回の学習をはじめていきます。

f:id:YuyaTerayama:20180911123205p:plainswap( )関数は、

引数xとyを交換する処理を行う関数として作成しました。

この関数内では、次のような手順で変数xとyの値を交換していきます。

f:id:YuyaTerayama:20180911123539p:plain

変数tmpを介してxとyを交換しています。

これでxの値とyの値が交換されるはずです。

ところが、

この関数を呼び出してみると、

実際には思った通りの処理が行われません。

swap( )関数を実際に使ってみます。

以下のコードを入力してみてください。

sample69.c

f:id:YuyaTerayama:20180911124210p:plainーsample69の実行画面ー

変数num1の値は7です。

変数num2の値は10です。

変数num1とnum2の値を交換します。

変数num1の値は7です。

変数num2の値は10です。

変数num1とnum2を交換するため、

swap( )関数を呼び出してnum1とnum2を、

実引数として渡してみました。

しかし、実行結果をみてわかる通り、

変数num1とnum2の値は交換されていません。

何故なのか見ていきます。

 

関数に引数を渡す方法

関数に実引数を渡す際には、

実引数の「値」だけが関数内に渡される

ということになっています。

このような引数の渡し方を、

値渡し(pass by value

と呼びます。

関数内で仮引数xとyの値を交換する処理を行っても、

これは変数num1とnum2の値を「コピー」した7と10を、

交換しているにすぎません。

つまり、swap( )関数内で値を交換しても、

呼び出し元の変数である、

num1とnum2に影響を与えることができません。

ところがポインタをうまく使うことで、

関数の呼び出し時に指定した、

引数の値を変更することができます。

このためには、swap( )関数の

仮引数をポインタとして定義する

ということが必要です。

そこで以下のようにswap( )関数を書き換えます。

f:id:YuyaTerayama:20180911125312p:plain

今回は仮引数にポインタを使いました。

ただし、関数内では*を使ってポインタが、

さし示しているものどうしを交換しているので、

先ほどのswap( )関数と内容として同じものとなっています。

この関数を呼び出すには、

仮引数がポインタなので、

変数のアドレスを引数として渡します。

関数の引数にポインタを使ったコードを、

入力してみます。

sample70.c

f:id:YuyaTerayama:20180911125808p:plainーsample70の実行画面ー

変数num1の値は7です。

変数num2の値は10です。

変数num1とnum2の値を交換します。

変数num1の値は10です。

変数num2の値は7です。

sample70の実行画面をみてわかる通り、

正しく交換されています。

この関数内では、

仮引数側の*pX、*pYを変更する

→実引数側のnum1、num2を変更する

ポインタを関数の仮引数として使うと、

実引数の値を変更することができるようになります。

尚、関数が呼び出されるとき、

実引数のアドレスが関数に渡されることを、

参照渡し(pass by reference)

と呼びます。

今回のポインタを使った関数は、

アドレスを指定して関数に渡すため、

実質的に参照渡しの関数となっています。

 

ポインタの使い道

C言語ではポインタを使うことで、

渡した実引数に変更を加える関数を作成することができます。

引数にポインタを使う方法は、

特に呼び出し元の「複数個」の変数を、

関数内で直接変更したい場合に便利です。

複数個の変数を一度に変更したい場合には、

戻りの仕組みを使うことができません。

関数の戻り値は1個に限定されているからです。

このため、複数個の変数を変更する場合には、

ポインタを使うと良いです。

ポインタにはこれ以上にも様々な使い方があります。

 

それについては次回また学んでいきます。

 

〜END〜