はじめての C

[Learning GNU C]

第5章 ポインタ

学生から プログラマを 区分 sort するもの。

5.1. 基本

関数は その返り値を 通してのみ プログラムに 作用するという 1つの 制限に 気づいただろう。 そこで 関数を 変数より もっと 効果の あるものと したい場合 どうすれば いいのか? ポインタを 使うことだ。 ポインタは 特別な 種類の 変数だ。 ポインタは メモリアドレス、つまり 別の 変数の アドレスを 記憶するよう 設計されている。 ポインタの 宣言は その変数の 識別子 (名前) の 前に アスタリスク '*' を つける 他は 普通の 変数の 宣言と 同じだ。 ポインタを 使って 作業する上で 知っておく 必要のある 2つの 新しい 演算子が ある。 "address of" 演算子 '&' と 間接演算子 deferencing operator の '*' だ。 2つとも 前置単項演算子 prefix unary operator だ。 変数の 前に アンド ampersand '&' を つけることで そのアドレスを 得て これを ポインタに 記憶させることが できる。 (また) ポインタの 前に アスタリスク '*' を つけることで それが 指し示す point メモリアドレスの 値が 得られる。 いつものように これが どれほど 簡単かを 示す 即製の 例題を 見よう。

Example 5-1. pointers_are_simple.c

#include <stdio.h>

int
main()
{
int my_variable = 6, other_variable = 10;
int *my_pointer;

printf("the address of my_variable is : %p\n", &my_variable);
printf("the address of other_valuable is : %p\n", &other_valuable);

my_pointer = &my_variable;

printf("\nafter \"my_pointer = &my_variable\":\n");
printf("\tthe value of my_pointer is %p\n", my_pointer);
printf("\tthe value at that address is %d\n", *my_pointer);

my_pointer = &other_variable;

printf("\nafter \"my_pointer = &other_variable\":\n");
printf("\tthe value of my_pointer is %p\n", my_pointer);
printf("\tthe value at that address is %d\n", *my_pointer);

return 0;
}

出力は 2つの 変数の アドレスを 表示する。 あなたの システムが 変数に 割り当てた アドレスは 私のものとは 異なるはずだ。 printf() では アドレスを 表示するため "%p" を 使うことに 注意。 これは 全ての ポインタに 対する 変換指定子だ。 私が 得た 出力では 常に こうなる。

the address of my_variable    : 0xbffffa18
the address of other_variable : 0xbffffa14

after "my_pointer = &my_variable":
the value of my_pointer is 0xbffffa18
the value at that address is 6

after "my_pointer = &other_variable":
the value of my_pointer is 0xbffffa14
the value at that address is 10

ほら、これは それほど 複雑では ない。 一度 ポインタに 親しめば C の 習得は ずっと 前へ 進む。