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

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

アレサ

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


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


変更してみます」


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


アドレスさえわかれば


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


格納されているデータを自由に変更できるってこと??


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


アレサ「すごいんですの


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


#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' が使用されます




アレサ「Visual Studioでは


変数(ポインタ変数)が初期化されていないプログラムを実行することはできません


このプログラムでは


ポインタ変数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' が使用されます


アレサ「Visual Studioでは


変数(ポインタ変数)が初期化されていないプログラムを実行することはできません


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


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

(変数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のアドレスの場所のメモリに格納されている数値に変更を加えようと


していることが


わかるってわけだね。」


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


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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