例えば、ある変数に収めたテキストを、別の変数に収めるとしましょう。普通に考えれば、こんな感じになりますね。
ところが、これはエラーになります。配列というのは、{}で初期値を用意するか、あるいはインデックスを指定して1つ1つの要素に値を設定していきます。こんな具合に、イコールでまるごと別の配列に入れたりはできなんです。
配列という、普通の値とは違う特殊な値を利用するために、テキストの使いは一般の数字などとはかなり違うやりかたになってしまうのです。変数に収めてあるテキストを別の変数に移すことすら、面倒なことをしないといけません。
が、ここでちょっと発送の転換をしてみることにしましょう。イコールでの代入っていうのは、「ある値を、別の変数にコピーする」ということでした。ですから、配列はたくさんの値から構成されるので、「そんな簡単にコピー出来ないよ」となってしまったわけです。
だったら、配列そのものではなくて、「配列が保管されている、メモリ内の住所」をコピーすることにしたらどうでしょう? 配列っていうのは、メモリのあるところに、ずらっと値が保管されているんでしたね? 変数には、そのメモリの領域が割当てられていました。
そうじゃなくて、変数には「配列のデータが保管されている場所」のデータを入れておくのです。そうして、「ここに配列があるよ」というデータを変数でやり取りする。そして必要があれば、その場所からテキストを取り出す。こうすれば、手軽にテキストをやりとりできると想いませんか?
こうした考えから考案されたのが「ポインタ」という考え方です。ポインタというのは、「メモリ内のアドレス(住所)を値として扱うためのもの」です。これは、
こんな具合に、タイプの後に*をつけて変数宣言します。これで、そのタイプの値が置かれているアドレスを保管するための変数が用意されます。このアドレスを保管する変数を使えば、簡単にテキストを他の変数に渡すことができます。
アドレスというのは、ただの数字です。ですから、arr2 arrは、単に「arrに入っているアドレスの数字をarr2に代入する」というだけでしかありません。ですから、代入を使って簡単に値をやりとりすることができます。ね、簡単でしょう?