関数を利用する場合、必要な情報を引数で渡してして関数を呼び出します。
このとき、関数の外側で宣言されるグローバル変数などの情報に頼らず、
引数の情報だけで機能を実現させるプログラムができれば独立して動作できる関数といえます。
この引数を使った関数呼び出しによる実行のさせ方は、
コール バイ バリュー(call by value:
値渡しによる呼び出し)と呼ばれます。
それは、呼び出し側の実引数で表現した値が、仮引数の変数にコピーで渡されてから関数が始まる仕組みになっています。
この仮引数の変数は、実引数の値をコピーで記憶しているだけなので、
単純に実引数の変数内容を変更することができません。
では関数の引数で、呼び出し元の記憶内容が変更できる機能の関数はどう作ればよいでしょうか?
コール バイ バリューしかできないC言語では、実引数に変数そのものではなく、変数のポインタを
渡すことで実現できます。
関数側のプログラムでは、仮引数をポインタ変数にして受け取り、このポインタ介して、
それが指し示す記憶内容を変更すればよいのです。
C言語ではポインタデータに対して
ポインタ演算子(*)や配列演算子([])を使うことで、
それが指し示す記憶域をアクセスできるからです。
←ボタンクリックで説明していきます。
実引数で渡す変数などのポインタと仮引数のポインタ変数宣言において、
型が合わないとコンパイルエラーになります。
また、関数のプログラミングスタイルは配列先頭アドレスを受け取る場合と差異がありません。
つまり、このポインタ介した存在しない記憶域に対するコードを書いてもコンパイルエラーの指摘
がありません。記憶域以外のアクセス実行でエラーになりますが、バグの発見が難しいので注意が必要です。