本記事の内容
C言語のポインタにはとても苦労しました。
私の場合、その原因は2つの記号 *
と &
を十分に理解できていなかったことにあります。
しかし、中学校で習うレベルの英語に置き換えて考えてみると、とても理解しやすくなりました。
あくまでざっくりとした解説になります。
正確さに欠ける部分があれば、ぜひコメントでご指摘いただけると幸いです。
ポインタとは
ポインタは別の変数のメモリーアドレス(場所)を保存する変数です。
*
の2つの使い方
*
は宣言の時とその他で意味が異なります。
1. 宣言の時
int *ptr;
ptr(適当においた変数名)
が「int型の変数を指すポインタ型」であることを宣言しています。
int* ptr;
このような書き方でも同じ意味になります。
こちらの方が、変数ptr
がint
型へのポインタ型(int*
)であると直感的に理解しやすいです。
ただし、複数の変数を宣言する際には注意が必要です。例えば、
int* a, b;
と書くと、a
は int*
(ポインタ)ですが、b
は単なる int
です。
2. 宣言ではない時(デリファレンス)
*ptr
- 宣言ではない時、
*
はポインタ型の変数の前に付きます。 -
ptr(ポインタ型変数)
が指しているアドレスにある「値」にアクセスします。これを逆参照(dereference)といいます。 -
*
は "the value of" と置き換えることができます。*ptr
は ”the value ofptr
"ということです。(わかりやすい!)
&
:変数のアドレスを取得する演算子
int an_integer;
&an_integer
-
&an_integer
はan_integer(適当においた変数名)
のアドレスを取得します。 -
&
は "the address of" と置き換えることができます。&an_integer
は ”the address ofan_integer
"ということです。(わかりやすい!)
ポインタを使った操作の例
int an_integer = 100; // int型変数の宣言と初期化
int *integer_address = &an_integer; // ポインタ型変数の宣言と初期化
// &an_integer: the address of an_integer
*integer_address = 5;
// *integer_address: the value of integer_address
この結果、an_integer
の値は 100
から 5
に変化します。
まとめ
-
*
:- 宣言の時は、「ポインタ型である」ことを示す
- 宣言ではない時、ポインタ型変数の前に付いて、"the value of" と置き換えられる(逆参照)
-
&
: "the address of" と置き換えられる
参考