ポインタ変数とは 変数のアドレスを格納するための変数のことです 

てんC「はいっ、引き続きてんCです。


今日はポインタ変数についてお話していきたいと思います。(^^)/」


ソーラー「ポインタ変数ってよくきくね。


なんのことかな?


わからないな・・・」


solarplexuss「なんのことだろう・・・にゃん😺のことだろう・・・」


てんC「


ポインタ変数とは 変数のアドレスを格納するための変数です。


まず


(ここでは例として)変数aの変数宣言


をおこないます。


次に


ポインタ変数宣言をおこないます


そうしてポインタ変数をつくると


そのポインタ変数の中に変数aのアドレス(住所)


を格納することができます。


つまり『&a』(変数aのアドレス)をポインタ変数に


格納することができるわけです。


ポインタとは英語でpointer(指し示すもの)という意味であり


変数aのアドレスを格納したポインタ変数は


変数aのアドレスのメモリを指し示しているというわけです。


では実際に


その変数のアドレスを格納できるポインタ変数を宣言してみましょう。


ポインタ変数を宣言するには


ポインタ変数にしたい自分で選んだ任意の半角英数字の前に


*(アスタリスク)をつけることから始まります。



*印はそのあとにつづく文字をポインタ変数とするためにつけられるのです。


例えば


int* pta;  ( この場合ptaがポインタ変数として宣言されています。)

int* neko; (この場合nekoがポインタ変数として宣言されています。)


あるいは


int *pta;  ( この場合ptaがポインタ変数として宣言されています。)

int *neko; (この場合nekoがポインタ変数として宣言されています。)


のように記述します


どちらの記述方法でもかまいません


ポインタ変数ptaも変数であるので


ポインタ変数ptaを収める型というものが存在します


この例では、ポインタ変数は


int* 型(イントアスタリスク型)に格納されています


int* pta;


int* 型(イントアスタリスク型)のポインタ変数宣言が


おこなわれているというわけです


ソーラー「イントアスタリスク型???」


てんC「ここで注意するのは


今までは変数aが整数の値を格納するなら


int a;とint 型を


変数bが実数の値を格納するなら


float b;とfloat 型を


というように


変数aやbに収められる数値の種類,によって整数値か実数値であるか


によって


変数宣言で使われる


変数の型が


int

float


のように

決められてきました。


ですが、


ポインタ変数の型は


ポインタ変数におさめられる数値の種類によって


ポインタ変数が格納される変数の型がきめられるわけではありません。



そもそもポインタ変数に格納されるのは変数のアドレスなので


格納されるのは常に整数値であり


(cout出力表示した場合)16進数の数値となっています


ソーラー「アドレスって004FFAD0みたいなやつのことだよね。


確か16進数であらわされているんだよね。」


てんC「そうなんです。


それではどのように


ポインタ変数の型はきめられるのでしょうか?


その仕組みはどのようなものになっているか・・というと


それは


int型の変数aのアドレス(&a)をポインタ変数ptaに格納するのなら


int* pta; (ここではptaがポインタ変数宣言されています。)

(int *pta;)


int* 型にポインタ変数ptaを格納するというきまりになっています。


つまり


ポインタ変数ptaがとりうる数値の種類(実数か整数)によって


ポインタ変数ptaを格納する変数の型が決まっているわけではなく


変数aが格納されている変数の型によって


決まっているというわけなんです。


同様に


float型の変数bのアドレス(&b)をポインタ変数に格納するのなら


次のように


float* ptb;  (ここではptbがポインタ変数宣言されています。)

(float *ptb;)  

とfloat*型にポインタ変数ptbを格納するきまりとなっています。


同様に


char型の変数cについているアドレス(&c)をポインタ変数に格納するのなら


次のように


char* ptc;  (ここではptcがポインタ変数宣言されています。)

(char *ptc;)

とchar*型にポインタ変数ptcを格納するきまりとなっています。


それでは


実際にプログラムを構成してポインタ変数に


変数aのアドレスが格納されていく様子をみていきましょう。


ソーラー「どんな仕組みになってるんだろうね


楽しみだね。😊」


#include <iostream>


using namespace std;


int main() {


int a=1;


int* pta;//int *pta;でも実行可能です

cout << "変数aのアドレスは" << &a << "です。\n";


pta = &a;


cout << "ポインタ変数ptaに格納された変数aのアドレス&aの値は"<<pta<<"です。\n";


return 0;


}



ビルド実行結果


変数aのアドレスは00FCF724です。

ポインタ変数ptaに格納された変数aのアドレス&aの値は00FCF724です。


てんC


「まず このプログラムにおいては



変数aの変数宣言


int a;



ポインタ変数ptaの変数宣言

int* pta;(int *pta;)

を実行しています。


そして&aによって変数aのアドレスを取得し


pta=&a;と


ポインタ変数ptaに変数aのアドレス&aを代入しているわけです。


ここで


*pta=&a;と*印をつける必要はありません。


*印はptaのポインタ変数宣言の時


ptaをポインタ変数とするためだけにつけられるので


ポインタ変数は*ptaでなくptaだからです。


ポインタ変数ptaに変数aのアドレス&aを代入した後は


ポインタ変数ptaをcout出力表示すれば


ポインタ変数ptaに格納された


変数aのアドレス(&a)が


16進数で


コマンドプロンプト画面に表示されます。


ここでprintf出力表示される変数aのアドレス&aの値は


00FCF724


となっていますが


このアドレスの値は みなさんが


お使いのパソコンやコンパイラによってことなってきます。


ポインタ変数について


うまく説明できましたですか?むずかしかったですか?


🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀



ポインタ変数の変数名にはptaやptbだけでなく


任意の半角英数字で名前をつけることができますが


普通の変数と区別がつかないような名前は付けないほうがよいとおもわれます。


もし


変数宣言、初期化 int a=1;をおこなったあと


変数aのアドレス&aを格納するために


ポインタ変数名をbとし


ポインタ変数宣言をおこなったら


どのようになるかを次のプログラムで観察してみましょう、


#include <iostream>


using namespace std;


int main() {


int a;

int* b;

cout<<"変数aのアドレスは"<<&a<<"です。\n";


b=&a;


cout<<"ポインタ変数bに格納された変数aのアドレス&aの値は<<b<<"です。\n";


return 0;


}


ビルド実行結果


変数aのアドレスは00B5FC90です。

ポインタ変数bに格納された変数aのアドレス&aの値は00B5FC90です。


うまくビルド実行できています。


別に問題はなさそうにみえます


ふふっ


ここであらたに


変数宣言 int c=2;

変数宣言 int d=3;


をおこない


それぞれのアドレス


&cと&dをポインタ変数に格納していきましょう。


&cと&dのアドレスを格納するために


それぞれに対応する


ポインタ変数名がeとfのポインタ変数宣言


int* e;

int* f;


をおこないます。


では、


これらの変数、ポインタ変数をもちいて


プログラムを構成してみましょう。


#include <iostream>


using namespace std;


int main() {


int a;

int c;

int d;

int* b;

int* e;

int* f;


b=&a;

e=&c;

f=&d;


cout << "変数aのアドレスは" << &a << "です。\n";

cout << "変数cのアドレスは" << &c<< "です。\n";

cout << "変数dのアドレスは" << &d << "です。\n";


cout << "ポインタ変数bに格納された変数aのアドレス&aの値は"<<b<<"です。\n";

cout << "ポインタ変数eに格納された変数cのアドレス&cの値は"<<e<<"です。\n";

cout << "ポインタ変数fに格納された変数dのアドレス&dの値は"<<f<<"です。\n";


return 0;


}


ビルド実行結果


変数aのアドレスは006FFA68です。

変数cのアドレスは006FFA5Cです。

変数dのアドレスは006FFA50です。

ポインタ変数bに格納された変数aのアドレス&aの値は006FFA68です。

ポインタ変数eに格納された変数cのアドレス&cの値は006FFA5Cです。

ポインタ変数fに格納された変数dのアドレス&dの値は006FFA50です。



ここでも めでたくビルド実行できています。



めでたし、めでたし😊




👇









👇









👇































かぽ~ん   とん


























かぽ~ん  とん
























かぽ~ん とん   かぽ~ん とん






































ようこそ、この東屋へ




どうぞ ごゆっくり・・・




お抹茶と羊羹をご用意いたしております。




優雅なひとときをおすごしください.  .  .  .  .  .  .








本日はお日柄もよく絶好のお茶会日和ですね。











ところで皆さん ここで質問のコーナーです




変数dのポインタ変数は何だったでしょうか?




わっかるかな~




ここで




変数dのポインタ変数をptdにしておけば




変数dのポインタ変数はptdと




すぐにわかります。




では次の質問です。




変数cは普通の変数だったでしょうか?




それともポインタ変数だったでしょうか?




わっかる~かな?




これも普通の変数はc,ポインタ変数はptcとしておけば




簡単にわかることでした。




このように




ポインタ変数を




eやfのように記述すると




普通の変数と区別がつかなくなります




まぎらわしすぎる・・・




そこでポインタ変数には




pteやptfのようにptをつけるなどのルールをきめておくのが良いと思われます  




                   solarplexussより 

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る