配列からポインタへ! (5/5)
作成:2011-02-03 11:47
更新:2011-02-03 11:47
更新:2011-02-03 11:47
■ポインタは、同じ値を共有する!?
このポインタを利用する場合、注意しなければいけない点がいろいろとあります。中でも、非常に重要なのは「ポインタの値をコピーした変数どうしでは、すべて同じデータを指し示す」という点でしょう。
例えば、あるテキストを保管するポインタ変数を用意します。そしてこれを、別のポインタ変数に代入します。するとこの時、2つのポインタ変数は「同じテキストを示す」ということはわかるでしょうか?
両者は、テキストが保管されているアドレスをコピーしているわけですから、どちらのポインタ変数にも同じアドレスが保管されます。つまり、どちらも同じアドレスにあるテキストを示しているわけです。
下に、ちょっとしたサンプルを用意しました。まず、txt1というchar配列にテキストを保管し、これをそのままcharポインタ変数txt2に代入します。そして、txt1の配列の要素をいろいろと変更してみます。そしてtxt2をprintfしてみると……修正したtxt1のテキストが出力されてしまいます。どちらも同じアドレスの値なので、片方で修正すれば、自動的にもう片方も値は変わってしまうのです(というか、そもそも同じ値を共有しているんですが)。
こんな具合に、ポインタの値を変数に代入するということは、「値をコピー」するのでなく「値のアドレスをコピー」するということをしっかり理解してください。これはポインタ利用の基本中の基本ですから。
というわけで、「最初にぶち当たる壁」とかいいながら、割とすらすら説明をしてきてしまいました。正直、「なんか、わかったようなわからないようなもやもやした感じ」の人もけっこくいると思います。
が、それでいいんです。「ポインタというものがあって、アドレスを値として扱っている」という、基本的なことだけわかっていれば、そんなに具体的にポインタの使い方をマスターする必要はありません。なぜって、あなたの目標は「C言語をマスターすること」ではなくて、「Objective-Cを学ぶこと」なんですから。でしょう?
Objective-Cのプログラミングをするとき、そんなむき出しのポインタを使ってあれこれ操作することなど、ビギナーのうちはあまりありません。Objective-Cでは、「id型」というポインタを利用した型があって、それでオブジェクトを色々扱うんですが、あまり「ポインタ」ということを意識しないでいいような形になっています。
ですから、「とりあえず、Objective-Cを勉強するためにCの基本を覚えておく」という目的からすれば、ポインタに関するこの程度の知識がごくざっと頭に入っていれば十分でしょう。――もちろん、本格的にObjective-Cを使うようになれば別ですよ。しっかりポインタをマスターしたほうがいいです。でも、今の段階では、「ポインタがわからないとダメ!」ってことはないです。このあたりの面倒くさい話はざっと流して、とっとと先へ進みましょう。
例えば、あるテキストを保管するポインタ変数を用意します。そしてこれを、別のポインタ変数に代入します。するとこの時、2つのポインタ変数は「同じテキストを示す」ということはわかるでしょうか?
両者は、テキストが保管されているアドレスをコピーしているわけですから、どちらのポインタ変数にも同じアドレスが保管されます。つまり、どちらも同じアドレスにあるテキストを示しているわけです。
下に、ちょっとしたサンプルを用意しました。まず、txt1というchar配列にテキストを保管し、これをそのままcharポインタ変数txt2に代入します。そして、txt1の配列の要素をいろいろと変更してみます。そしてtxt2をprintfしてみると……修正したtxt1のテキストが出力されてしまいます。どちらも同じアドレスの値なので、片方で修正すれば、自動的にもう片方も値は変わってしまうのです(というか、そもそも同じ値を共有しているんですが)。
こんな具合に、ポインタの値を変数に代入するということは、「値をコピー」するのでなく「値のアドレスをコピー」するということをしっかり理解してください。これはポインタ利用の基本中の基本ですから。
※……で、Objective-Cではどうなの?
というわけで、「最初にぶち当たる壁」とかいいながら、割とすらすら説明をしてきてしまいました。正直、「なんか、わかったようなわからないようなもやもやした感じ」の人もけっこくいると思います。
が、それでいいんです。「ポインタというものがあって、アドレスを値として扱っている」という、基本的なことだけわかっていれば、そんなに具体的にポインタの使い方をマスターする必要はありません。なぜって、あなたの目標は「C言語をマスターすること」ではなくて、「Objective-Cを学ぶこと」なんですから。でしょう?
Objective-Cのプログラミングをするとき、そんなむき出しのポインタを使ってあれこれ操作することなど、ビギナーのうちはあまりありません。Objective-Cでは、「id型」というポインタを利用した型があって、それでオブジェクトを色々扱うんですが、あまり「ポインタ」ということを意識しないでいいような形になっています。
ですから、「とりあえず、Objective-Cを勉強するためにCの基本を覚えておく」という目的からすれば、ポインタに関するこの程度の知識がごくざっと頭に入っていれば十分でしょう。――もちろん、本格的にObjective-Cを使うようになれば別ですよ。しっかりポインタをマスターしたほうがいいです。でも、今の段階では、「ポインタがわからないとダメ!」ってことはないです。このあたりの面倒くさい話はざっと流して、とっとと先へ進みましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
#include <stdio.h> int main (int argc, const char * argv[]) { char txt1[] = "This is test!"; char* txt2 = txt1; txt1[2] = 'a'; txt1[3] = 't'; txt1[8] = 'H'; txt1[9] = 'O'; txt1[10] = 'G'; txt1[11] = 'E'; printf("%s",txt2); return 0; }
※関連コンテンツ