はじめての C

sekiyo2007-06-16

[Learning GNU C]

5.4. ポインタ 演算 arithmetic

ちょうど 他の 変数のように ポインタでも 演算を 行なうことが できる。 これは ほんの わずかな 場合でしか 役に たたない。 (なんらかの 理由から) ポインタを 2つに 分けたりすると おそらく それは そのプログラムが 属していない コンピュータの メモリ領域を 指し示す point to ことになる。 プログラムが このメモリ領域で 読み/書きを 試みると "segumentation fault" という text が 表示されて プログラムは 中断されるだろう。 プログラムが アクセスの 許可されない メモリの 部分に アクセスを 試みたとき "segumentation fault" は 起こる。

しかし ポインタは 簡単な 加算 addition に 使えるときが ある。 これは 次の 章で 配列 array (連続した メモリアドレスを もつ 多項 multiple 変数) を 検討するときに 見てみよう。 加算 (それに 減算 subtraction) するとき 演算は ポインタの データ型と 等しい 単位で 行なわれる。

5.5. 汎用 generic ポインタ

void 型の ポインタで 変数を 宣言すると それは 汎用ポインタとして 認識される。 (実際には) void 型の 変数を もつことは できないので ポインタは どんな 型も 指し示さず そのため 参照 dereference が できない。それでも ポインタなので 使う 場合は 最初に それを 他の 種類の ポインタの 型に 当てはめて cast おかないと いけない。 このため 汎用ポインタと 表される。

これは ポインタが 異なった時に 異なった 型の データを 指し示す 場合に とても 役だつ。

これが void ポインタを 使った code だ。

Example 5-3. generic_pointer.c

#include <stdio.h>

int
main()
{
int i;
char c;
void *the_data;

i = 6;
c = 'a';

the_data = &i;
printf("the_data points to the integer value %d\n", *(int *) the_data);

the_data = &c;
printf("the_data now points to the character %c\n", *(char *) the_data);

return 0;
}