👇のエピソードをみればおわかりになられますように ポインタ変数の特徴は指定したアドレスの場所に格納されている数値を変更できることにあります 

ポインタ変数をつかえば ポインタ変数にアドレスを代入することにより そのアドレスの場所のメモリに格納されている数値を変更することができます

アレサ

「ポインタ変数にアドレスを代入し


そのアドレスの場所のメモリに格納されている数値を


変更してみます」


ソーラー「これは・・つまり


アドレスさえわかれば


そのアドレスのメモリの中に


格納されている数値を自由に変更できるってこと??


ポインタ変数ってすごいじゃないか」


アレサ「すごいんですの


次のプログラムをご覧くださいね。


#include <stdio.h>


int main (void){

int a=10;

int *pta;


pta=&a;


*pta=5;

printf("%d\n",a);


*pta=8;

printf("%d\n",a);


*pta=111;

printf("%d\n",a);


return 0;

}

コンパイル結果

5

8

111


このプログラムでは


pta=&a;


が実行されて


ポインタ変数ptaに変数aのアドレスが格納されています


このように

🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋

ポインタ変数ptaに変数aのアドレスを代入したなら


*ptaは 変数aのアドレスの場所のメモリに格納されている数値をあらわします。

🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋


ここがとっても重要なんですの。


まず最初におこなわなければいけないのは


ポインタ変数ptaに変数aのアドレスを代入するということですの。


ポインタ変数ptaに変数aのアドレスを代入(初期化)しなければ


*ptaは 変数aのアドレスに格納されている数値をあらわしません。


ポインタ変数ptaは初期化されていない状態では


    あるアドレス数値が格納されており


*ptaはそのアドレスの場所のメモリに格納されている数値を表すことになります


それは次のプログラムでご確認ください


#include <stdio.h>


int main (void){

int a=10;

int *pta;

/*ここではポインタ変数ptaにアドレスを代入せず初期化しません*/


printf("%d\n",*pta);


return 0;

}


(EAZY IDECの場合)


コンパイル結果


1703828



(Visual Studioの場合)


エラー C4700 初期化されていないローカル変数 'pta' が使用されます



このプログラムでは


ポインタ変数ptaに変数aのアドレスを代入して初期化しなかったため


ポインタ変数ptaにはあるアドレス数値が格納されています


そのアドレスの場所のメモリに格納されている数値


を*ptaはあらわしており


printf("%d\n",*pta);を実行すると


1703828がprintf出力表示されます



                *ptaは



ポインタ変数ptaに変数aのアドレスを


pta=&a;と


代入して、はじめて


*ptaは 変数aのアドレスの場所のメモリに格納されている数値を


表します


そしてここがおもしろいのですが


変数aのアドレスの場所に格納されている数値をあらわす


           *ptaに



           *pta=5;

            と

       *ptaに数値5を代入すれば


変数aのアドレスの場所のメモリに格納されている数値を5に変更することができるのです


変数aのアドレスの場所のメモリに格納されている数値が5に変更されれば


変数aの値は


a=5と変化します


その結果


printf("%d\n",a);


が実行されると


変数aに格納されている値5がprintf出力表示されます


*pta=8;と


*ptaに数値8を代入すれば


変数aのアドレスの場所のメモリに格納されている数値を8に変更することができます


変数aのアドレスの場所のメモリに格納されている数値が8に変更されれば


変数aの値は


a=8と変化します


その結果


printf("%d\n",a)」

が実行されると

変数aに格納されている値8がprintf出力表示されます」



では次のプログラムをご覧ください


#include <stdio.h>


int main (void){

int a=10;

int *pta;

/*ここではポインタ変数ptaにアドレスを代入せず初期化しません*/


printf("%d\n",*pta);


*pta=8;

printf("%d\n",a);


*pta=111;

printf("%d\n",a);


return 0;

}



(EAZY IDECの場合)


コンパイル結果


1703828

10

10


(Visual Studioの場合)


エラー C4700 初期化されていないローカル変数 'pta' が使用されます




ptaに変数aのアドレスを格納しなければ


*ptaは変数aのアドレスの場所のメモリに格納されている数値をあらわさないので


*ptaにいくら数値

111を代入しても


変数aのアドレスの場所のメモリに格納されている数値は


8や111には変更されません。


つまり


変数aに格納されている値は


8や111には変更されません。


この場合


変数aに格納されている数値は


最初のaの変数宣言、初期化


int a=10;


により

a=10のままなので


printf("%d\n",a);


の実行結果は10となるわけです


このように


ポインタ変数ptaに変数aのアドレスを代入(初期化)しなければ


*ptaは 変数aのアドレスの場所のメモリに格納されている数値をあらわさないことが


わかりますね」




ソーラー


「となると


ポインタ変数ptaに変数aのアドレスを代入すると


いう命令文


pta=&a;


がでてきた時点で


変数aのアドレスの場所のメモリに格納されている数値に変更を加えようと


していることが


わかるってわけだね。」


アレサ「そう、そうです ソーラーさん 冴えてる~😊」


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

作者を応援しよう!

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

応援したユーザー

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