プログラム中に文字列定数(""で囲まれた文字列)を書くと, それを格納する領域が用意され,値としてその領域の先頭のアドレスを持つ. その値をポインタ変数に代入することができる. ただし,その領域の内容を書き換えることはできない. 変数の宣言部におけるポインタ変数の初期値の設定としても, 文字列定数を使うことができる.
char *s1 = "abc"; → 初期値の設定
char *s2;
s2 = "ABC"; → 文字列定数の先頭アドレスの代入
*s1 = 'x'; → 不可
s2[2] = 'y'; → 不可
配列の初期値の設定と混同しないように.
char a1[] = "abc"; → 初期値の設定
char a2[10];
a2 = "ABC"; → 不可
*a1 = 'x'; → 要素の書き換えは可能
a2[2] = 'y'; → 要素の書き換えは可能
ポインタを要素とする配列を作ることができる.
型名 *変数名[要素数];
(例)
char *pa[100];
アクセスする場合は,pa[12][34]と2次元配列のようにも書くことができるが,
2次元配列とは領域の確保のされ方が全く異なる.以下の具体例で比較しよう.
文字型のポインタ配列の例.
C言語では,変数に割り当てられるメモリ上の領域の大きさは, あらかじめ決まっていないといけない. 例えば,配列の要素数を,ある時には100, ある時には1000というような割り当て方はできない.
それでは不便なので,標準ライブラリには,OSの助けを借りて, 実行時に記憶領域を指定した量だけ割り当てる関数malloc()が用意されている.
ポインタ変数 = malloc(割り当てに必要なバイト数);
という使い方をする.戻り値は割り当てられた記憶領域の先頭アドレス.
割り当てに失敗した場合はNULLを返す.
割り当てるばかりでは,メモリをどんどん消耗してしまうので, その領域が不要になったら,解放する.そのためには,関数free()を使う.
free(mallocした時の先頭アドレス);
malloc()で割り当てた先頭アドレス以外を引数にした場合は,
正しく処理されない.
また,解放された領域がどのようにリサイクルされるかは,
ライブラリ任せであり,ユーザの関知するところではない.
malloc()やferr()を使う場合は, 必ず標準のヘッダファイルstdlib.hを#includeする.
(例)
#include <stdlib.h>
(中略)
int *pi;
double *pd;
pi = malloc(sizeof(int)); → int型1個分の領域を確保.
pd = malloc(sizeof(double)*10); → double型10個分の領域を確保.
*pi = 100;
pd[3] = 3.14;
free(pi);
free(pd);
可変な人数分の点数を入力し,その平均値と標準偏差を計算する. 情報処理演習で配列を習ったときの例によく似ているが, プログラムの中で配列を使っていない(配列流のアクセスの記述は使っている). プログラムが実行されてから, 必要な人数分の記憶領域をmalloc()を使って確保する. 1組の計算が終了したら,確保された領域を解放し,処理を繰り返している. 試しに人数に非常に大きな数を指定してみよう.