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

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

はいっ、引き続きアレサです。


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


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


まず

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


をおこないます。


次にポインタ変数をつくると


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


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


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


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


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


変数aのアドレスは


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


では実際に


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


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


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


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


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


例えば


ポインタ変数宣言は次の例のようになるわけです。


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

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


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


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


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


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


int *pta;



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


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


ここで注意するのは


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


int a;とint 型を


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


float b;とfloat 型を


というように


変数aやbに収められる数値の種類によって


変数宣言で使われる


変数の型が決められてきました。


ですが、


ポインタ変数の型は


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


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



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


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


(%pをもちいてprintf出力表示した場合)16進数の数値となっています


それではどのように


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


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


それは


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


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



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


つまり


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


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


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


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


同様に


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


次のように


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


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


同様に


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


次のように


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


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


それでは


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


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


#include <stdio.h>


int main(void){

int a=1;

int *pta;


printf("変数aのアドレスは%pです。\n",&a);

pta=&a;

printf("ポインタ変数ptaに格納された変数aのアドレス&aの値は%pです。\n",pta);

return 0;

}

コンパイル結果


EAZY IDECの場合


変数aのアドレスは0019FF54です。

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


Visual Studioの場合


変数aのアドレスは0086FCB8です。

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


アレサ

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




変数aの変数宣言

int a;


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

int *pta;

を実行しています。


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


pta=&a;と


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


ここで


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


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


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


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


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


printf関数をもちいて


ポインタ変数ptaを%p出力変換指定子をつかってprintf出力表示すれば


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


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


16進数で


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


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


(EAZY IDECの場合)


0019FF54


となっていますが


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


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


ポインタ変数について


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


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


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


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


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


もし


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


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


ポインタ変数名をbとし

 

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


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


#include <stdio.h>


int main(void){

int a;

int *b;


printf("変数aのアドレスは%pです。\n",&a);

b=&a;

printf("ポインタ変数bに格納された変数aのアドレス&aの値は%pです。\n",b);

return 0;

}

コンパイル結果


(EAZY IDECの場合)


変数aのアドレスは0019FF54です。

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


うまくコンパイルできています。


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


ふふっ


ここであらたに


変数宣言 int c=2

変数宣言 int d=3


をおこない


それぞれのアドレス


&cと&dを格納していきましょう。


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


それぞれに対応する


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


int *e

int *f

をおこないます。


では、

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


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


#include <stdio.h>


int main(void){

int a;

int c;

int d;

int *b;

int *e;

int *f;

b=&a;

e=&c;

f=&d;

printf("変数aのアドレスは%pです。\n",&a);

printf("変数cのアドレスは%pです。\n",&c);

printf("変数dのアドレスは%pです。\n",&d);

printf("ポインタ変数bに格納された変数aのアドレス&aの値は%pです。\n",b);

printf("ポインタ変数eに格納された変数cのアドレス&cの値は%pです。\n",e);

printf("ポインタ変数fに格納された変数dのアドレス&dの値は%pです。\n",d);

return 0;

}


(EAZY IDECの場合)


コンパイル結果


変数aのアドレスは0019FF54です。

変数cのアドレスは0019FF50です。

変数dのアドレスは0019FF4Cです。

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

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

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



ここでも めでたくコンパイルできています。



めでたし、めでたし😊


👇







👇







👇





























かぽ~ん   とん
























かぽ~ん  とん




























































ようこそ、この東屋へ


どうぞ ごゆっくり・・・


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


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





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


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


わっかるかな~


ここで


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


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


すぐにわかります。


では次の質問です。


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


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


わっかる~かな?


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


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


このように


ポインタ変数を


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


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


まぎらわしすぎる・・・


そこでポインタ変数には


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


                   solarplexussより 

          

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

作者を応援しよう!

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

応援したユーザー

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