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

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

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


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


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


まず

(ここでは例として)変数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* 型(イントアスタリスク型)のポインタ変数宣言が


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


ここで注意するのは


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


int a;とint 型を


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


float b;とfloat 型を


というように


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


つまり


整数値か実数値であるか


によって


変数宣言で使われる


変数の型が


int

float


のように

決められてきました。


ですが、


ポインタ変数の型は


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


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



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


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


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


それではどのように


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


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


それは


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


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

(int *pta;)


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


つまり


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


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


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


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


同様に


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


次のように


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

(float *ptb;)  

とfloat*型(フロートアスタリスク型)にポインタ変数ptbを格納するきまりとなっています。


同様に


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


次のように


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

(char *ptc;)

とchar*型(キャラアスタリスク型)にポインタ変数ptcを格納するきまりとなっています。


それでは


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


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


#include <stdio.h>


int main(void){

int a=1;

int* pta;//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型の変数宣言

int a;


ポインタ変数ptaのint*型の変数宣言

int* 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のアドレス&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より 

          











          🐤













                   🐓🐓🐓






おまけのコーナー


みなさん


ときどき


charへのポインタという言葉を聞くことがありませんか?


charへのポインタとは


char型の変数のアドレスを格納するポインタ変数のことです


なぜ


charへのポインタと


いわれているのでしょうか?



例えば


char a;


を実行して


char型の変数aを作製したとします


変数aには数値データ1が代入されているとします


次に


char* pta;


によって生成されるchar*型のポインタ変数ptaを生成したとします


このchar型の変数aのアドレスは


char*型のポインタ変数ptaに


pta=&aのように代入することができます


そのことを図示すると以下のようになります

👇

https://solarplexusssolarplexusss.blogspot.com/2020/05/blog-post_4.html


ポインタとは


英語では


pointerと記述されます


pointは点という意味もありますが


動詞で指さすという意味もあります


そして


pointerには指し示すもの


という意味があります


つまり


char*型のポインタ変数は


char型の変数を指し示すもの


なのです



そして



ptaはchar*型のポインタ変数です



という日本語を英訳すると



pta is pointer to variable of char type



となります




is

です


pointer

ポインタ


to

~への


variable

変数


type


char typeはchar型 


という意味です


ですので


pta is pointer to variable of char type



日本語に再翻訳すると


ptaはchar型の変数へのポインタです


となります


略して


ptaはcharへのポインタ変数です


と呼ばれることになるわけです

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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