配列からポインタへ! (3/5)
作成:2011-02-03 10:13
更新:2011-02-03 10:20
更新:2011-02-03 10:20
■ポインタとアドレス
さて、この「char配列でテキストを扱う」というの、まぁ一応テキストを利用出来るようにはなりましたが、なんだか面倒くさいと思いませんか? テキストを出力するのに、繰り返しを使って1つずつ文字を取り出していくなんて……。もうちょっとスマートなやり方がほしいところですね。実を言えば、テキストを出力するなら、printfはこれだけでOKなんです。
例えば、ある変数に収めたテキストを、別の変数に収めるとしましょう。普通に考えれば、こんな感じになりますね。
配列という、普通の値とは違う特殊な値を利用するために、テキストの使いは一般の数字などとはかなり違うやりかたになってしまうのです。変数に収めてあるテキストを別の変数に移すことすら、面倒なことをしないといけません。
が、ここでちょっと発送の転換をしてみることにしましょう。イコールでの代入っていうのは、「ある値を、別の変数にコピーする」ということでした。ですから、配列はたくさんの値から構成されるので、「そんな簡単にコピー出来ないよ」となってしまったわけです。
だったら、配列そのものではなくて、「配列が保管されている、メモリ内の住所」をコピーすることにしたらどうでしょう? 配列っていうのは、メモリのあるところに、ずらっと値が保管されているんでしたね? 変数には、そのメモリの領域が割当てられていました。
そうじゃなくて、変数には「配列のデータが保管されている場所」のデータを入れておくのです。そうして、「ここに配列があるよ」というデータを変数でやり取りする。そして必要があれば、その場所からテキストを取り出す。……こうすれば、手軽にテキストをやりとりできると想いませんか?
こうした考えから考案されたのが「ポインタ」という考え方です。ポインタというのは、「メモリ内のアドレス(住所)を値として扱うためのもの」です。これは、
アドレスというのは、ただの数字です。ですから、arr2 = arrは、単に「arrに入っているアドレスの数字をarr2に代入する」というだけでしかありません。ですから、代入を使って簡単に値をやりとりすることができます。ね、簡単でしょう?
下に、ポインタを使ってテキストを別の変数に代入する例をあげておきましょう。ポインタ変数は、テキストそのものではなくてテキストのアドレスを渡すものですが、実はprintfでも「%s」でちゃんとテキストを取り出して出力させることができます。――どうです。ポインタを使うと、ずいぶんとすっきりとテキストが扱えるようになるでしょう?
printf("%s",arr);「%s」というのは、テキストとして値をはめこむための記号です。こうすれば、arr配列のテキストをそのまま書き出すことが出来るのですね。これはとても便利です。――が、しかしこれはprintfという関数が独自にそういう機能を持っているからできることです。実際の値の利用においては、テキストは他の数字などの値とはちょっとばかり扱い方が違ってきます。
例えば、ある変数に収めたテキストを、別の変数に収めるとしましょう。普通に考えれば、こんな感じになりますね。
char arr[] = "Hello";ところが、これはエラーになります。配列というのは、{}で初期値を用意するか、あるいはインデックスを指定して1つ1つの要素に値を設定していきます。こんな具合に、イコールでまるごと別の配列に入れたりはできなんです。
char arr2[] = arr;
配列という、普通の値とは違う特殊な値を利用するために、テキストの使いは一般の数字などとはかなり違うやりかたになってしまうのです。変数に収めてあるテキストを別の変数に移すことすら、面倒なことをしないといけません。
が、ここでちょっと発送の転換をしてみることにしましょう。イコールでの代入っていうのは、「ある値を、別の変数にコピーする」ということでした。ですから、配列はたくさんの値から構成されるので、「そんな簡単にコピー出来ないよ」となってしまったわけです。
だったら、配列そのものではなくて、「配列が保管されている、メモリ内の住所」をコピーすることにしたらどうでしょう? 配列っていうのは、メモリのあるところに、ずらっと値が保管されているんでしたね? 変数には、そのメモリの領域が割当てられていました。
そうじゃなくて、変数には「配列のデータが保管されている場所」のデータを入れておくのです。そうして、「ここに配列があるよ」というデータを変数でやり取りする。そして必要があれば、その場所からテキストを取り出す。……こうすれば、手軽にテキストをやりとりできると想いませんか?
こうした考えから考案されたのが「ポインタ」という考え方です。ポインタというのは、「メモリ内のアドレス(住所)を値として扱うためのもの」です。これは、
タイプ * 変数名こんな具合に、タイプの後に*をつけて変数宣言します。これで、そのタイプの値が置かれているアドレスを保管するための変数が用意されます。このアドレスを保管する変数を使えば、簡単にテキストを他の変数に渡すことができます。
char* arr = "Hello!";例えば、これでarrのテキストをarr2に渡すことができます。C言語では、テキストの値は、そのままcharポインタ変数に代入することができます。こんな具合に、"Hello"というテキストを、charポインタ変数に代入すれば、このテキストが保管されいてるアドレスをarrで管理できるようになるのです。
char* arr2 = arr;
アドレスというのは、ただの数字です。ですから、arr2 = arrは、単に「arrに入っているアドレスの数字をarr2に代入する」というだけでしかありません。ですから、代入を使って簡単に値をやりとりすることができます。ね、簡単でしょう?
下に、ポインタを使ってテキストを別の変数に代入する例をあげておきましょう。ポインタ変数は、テキストそのものではなくてテキストのアドレスを渡すものですが、実はprintfでも「%s」でちゃんとテキストを取り出して出力させることができます。――どうです。ポインタを使うと、ずいぶんとすっきりとテキストが扱えるようになるでしょう?
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
#include <stdio.h> int main (int argc, const char * argv[]) { char* arr = "Hello!"; char* arr2 = arr; printf("%s",arr2); return 0; }
※関連コンテンツ