演習時間: 40 分


1. 値渡しとポインタ渡し


演習 1 (個人PC、20分): この演習では「ポインタ渡し」の活用例として「スワップ(swap)関数」を作ってみましょう。

スワップ関数は二つ以上の変数の値を入れ替えるための関数で、「ポインタ渡し」の活用例として良く挙げられます。
例えば int a と int b という int 型の変数にそれぞれ 1 と 2 が入っている時、このスワップ関数を呼び出すと中身が入れ替わって a が 2、b が 1 となります。

さて「ポインタ渡し」を学んでいない C 言語初学者にスワップ関数を作ってもらうと「値渡し」を使って必ず次のようなコードを書きますが、テキストに書いてあるように「値渡し」では main 関数の変数 a、b の値を変えることが出来ません。

「値渡し」を使ったスワップ(swap)関数の失敗例
#include <stdio.h>

void swap( int a, int b )
{
   int c = b;
   b = a;
   a = c;
}


int main()
{
   int a = 1;
   int b = 2;
   
   printf("a = %d, b = %d\n", a, b );
   swap( a, b );
   printf("a = %d, b = %d\n", a, b );

   return 0;
}

ではこの失敗例を修正しながら「ポインタ渡し」の演習を行なって行きましょう。

上の「値渡し」を使ったコードを実行し、「値渡し」の方法では main 関数の a と b の値が入れ替わらないことを確認して下さい。
スワップ関数の 2 つの引数定義を「ポインタ渡し」の方法に変更して下さい。引数名も a を pa、b を pb に変えて下さい。
スワップ関数の中身を間接演算子 * を使う様に書き換えて下さい。

 ※ 変数 c は int 型変数のままにしておいて下さい。

main 関数のスワップ関数の呼び出し部分で、アドレス演算子 & を使って a と b のアドレスを関数に渡すように書き換えて下さい。
スワップ関数が正常に動作することを確認して下さい。
ドキュメントファイルに「ソースコード」と「実行結果」をコピーして保存してください。


2. 配列渡し

演習 2 (個人PC、20分): 「配列渡し」を使って関数の中で配列の各要素の中身を操作してみましょう。

main 関数を作る前に以下の仕様で関数を作って下さい。

(1) 関数の戻り値の型は void 型とする。

(2) 関数名は HOGE とする。

(3) int 型のポインタ変数 pa を引数とする。

 ※ もちろん引数定義として記法 2 又は記法 3 を使っても構いません。

(4) 関数の中で以下のように呼び出し元の配列の各要素を操作する。

4-1. 呼び出し元の 0 番目の要素に 12 をセットする
4-2. 呼び出し元の 1 番目の要素に 34 をセットする。
4-3. 呼び出し元の 2 番目の要素の中身を 2 倍する

HOGE 関数の下から main 関数を始めて下さい。
main 関数の中で int 型の長さ 3 の配列 a を定義して下さい。
a[0] と a[1] に 0 を、a[2] に 2 を代入して下さい。
HOGE 関数を呼び出し、配列 a の中身を書き換えて下さい。
HOGE 関数から main 関数に戻ったら for ループと printf を使って a[0] 〜 a[2] の内容(10進数)を表示して下さい。
ドキュメントファイルに「ソースコード」と「実行結果」をコピーして保存してください。


3.ヌルポインタとオーバーラン

今年度は省略


4.ポインタを戻り値とする関数

今年度は省略