- 10-3 ポインタと配列
- なんと。[]は演算子であり、vc[2]も2[vc]も同じことなんだ。。。
- じぶんなりにポインタをまとめてみる。
- int nx;
によって、メモリ上にint型の値を格納する領域が確保される。その領域に対して値を読み書きするには、nxという変数名が使える。 - この機構の背後には変数名の管理機構がある。それは次の機能をもっている。
- nxという識別子が確保している領域がint型であるということ。
- nxという識別子と確保領域のメモリアドレスとの紐づけ。
- nxという識別子が確保している領域がint型であるということ。
- ひとつのプログラムの中でも識別子は複数存在し、これら管理情報は一種のテーブルを成している。
- C言語では、このテーブルにアクセスすることができる。
- まず、nxと紐付けられているアドレスの値を、&nxで得ることができる。これは、まあリテラルである。
- アドレスをC言語の中で取り扱うにあたって、それ自身もC言語の型機構に適合させてしまう。
- すなわち、ポインタ型という型を用意する。
- ポインタ型は例えば、int *ptr;などと宣言する。
- すると、ptr = &nx; などとできる。
- これらは上に述べた識別子の機構にあてはめると次のようなことである。
- ptrという識別子が確保している領域がintのポインタ型であるということ。
- ptrという識別子と確保領域のメモリアドレスとの紐付け。
- ptrという識別子が確保している領域がintのポインタ型であるということ。
- ポインタ(値)にはいくつかの演算が用意されている。
- *演算子は、ポインタ(値)が値としてもっているメモリアドレスに格納されている値を指すことができる。
- すなわち、*ptrはnxの別名と考えてよい。
- 配列というのは、宣言以外の部分については、ポインタ型を用いたメモリ操作の構文糖衣と考えてもよい。
- int vc[] = {1 , 1, 0};などとしたとする。
- vcはこれ以降、配列の先頭要素のアドレスを保持するintのポインタ型の識別子である。
- すなわち、vc = &vc[0]が成り立つ。
- これによって、関数の引数に配列を与えたとき、関数の内部でその配列を操作した場合に、もとの配列が破壊的に操作される。
- 仮引数における、int vc[]というのはint *vcと可換である。
- ptr = &vc[0] (またはvc)としたとき、vc[i], *(ptr + i), ptr[i] は同じことの別表現である。
- ポインタ値に対する算術はそのポインタ値が配列の一部を指すとき存在し、自然数を体とするものであり、その単位である1は、メモリアドレスの1ではなく、対象となる配列の要素の個数である。メモリアドレスでいうと型のsizeof分が1に換算される。
- int nx;
- てな感じなのかなぁ。
- なんと。[]は演算子であり、vc[2]も2[vc]も同じことなんだ。。。
とりあえず、ポインタの前半戦はおしまい。
次は、ポインタと文字列だ!
0 件のコメント:
コメントを投稿