C言語においては, 関数の引数として受け渡される対象としては配列とポインタの区別がない.
関数へ配列を渡す場合は配列の名前だけを引数に書くことは既に述べた. 配列の名前だけを書くと,それは配列の先頭要素のアドレスを表している.つまり, 配列を関数に渡すときは,先頭要素のアドレス(と型の種類)だけが渡されている.
(例) void f(int *a) ←(等価)→ void f(int a[])
仮引数がポインタとして定義されている関数の実引数に配列名を渡しても構わない. 逆に,仮引数が配列として定義されている関数の実引数にポインタを渡しても構わない. ただし,型は一致している必要がある.
ポインタ値を戻り値とする関数を作ることができる.
以下のような形式で宣言・定義する.
型名 *関数名(引数宣言の並び)
ポインタ値を戻り値にするのは以下のような目的による.
char *strchr(char *s, int c);文字列sの中の最初に文字cが出現する位置を返す. 文字列の終端まで探して見つからなかった場合はNULLを返す.
char *f(char *s); char s[100] = "abc"; f(f(f(s)));と書くことができる.文字列を処理する関数に多い.
ポインタが無効な状態を表すために, 定数NULLが用意されている. これは,ポインタに値が代入されていない状態とは異なるので注意.
NULLはヘッダファイルstdio.hの中で定義されており, 通常ポインタとして使われることない0番地という値が使われている.
#define NULL (void *)0(void *)はどのような型へのポインタにも代入できる汎用ポインタへのキャストを意味する.
NULLポインタは,ポインタ値を戻り値とする関数が, 処理に失敗した場合の戻り値としてよく使われる. 次回以降にそのような例を紹介する.