配列には自分でポインタ変数を作製しなくとも配列を作った時点で配列専用のポインタ変数が用意されているのですの😚  

アレサ「さきほどは配列変数hairetu[0]に


対応するポインタ変数pthairetu[0]を作りましたが


うまく機能せず


無駄に失敗におわりました。」


ソーラー「さらっと無駄っていっちゃたよぉ~~~」


アレサ 「実は、配列には


配列宣言を行ったなら


配列変数に対応する


ポインタ変数が自動的に用意されているのです。


具体例をみていきましょう。


int hairetu[3];

hairetu[0]=1;

hairetu[1]=2;

hairetu[2]=3;


と配列宣言、初期化をおこなったなら、ですが


この場合


🍅ポインタ変数宣言、初期化をおこなっていないのですが


すでにhairetu[0]のアドレス&hairetu[0]が格納されて初期化されている

hairetu[0]に対応するポインタ変数


hairetu


すでにhairetu[1]のアドレス&hairetu[1]が格納されて初期化されている

hairetu[1]に対応するポインタ変数


hairetu+1


すでにhairetu[2]のアドレス&hairetu[2]が格納されて初期化されている

hairetu[2]に対応するポインタ変数


hairetu+2


つまり


これらの配列変数

👇

hairetu[0]

hairetu[1]

hairetu[2]

アドレスがすでに格納され初期化されている


ポインタ変数

hairetu

hairetu+1

hairetu+2

が自動的に用意されているのです。🍅


ですので


ポインタ変数宣言


int* pthairetu[0];


pthairetu[0]=&hairetu[0];


を実行して


pthairetu[0]のような


hairetu[0]に対応するポインタ変数pthairetu[0]を


あらたに作製しなくてもよいのです。というか


先程のエピソードをみてもおわかりになられますように


pthairetu[0]をつくってもうまく機能しないのです。ね。😝


ソーラーさん」


ソーラー 「娘や・・・父に容赦ないのう


私がお前の父であることを忘れたか!」


ソーラー 「忘れたか!」


アレサ「ではでは お父様(^^)


この3つのポインタ変数


hairetu

hairetu+1

hairetu+2

のなかでも


hairetu[0]のアドレスである&hairetu[0]が格納されて初期化されている


hairetu[0]に対応するポインタ変数


hairetu


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


代表的な2つの命令文


ポインタ変数hairetuに格納されているアドレスを

printf出力表示する命令文と


ポインタ変数hairetuに*演算子を作用させた


*hairetuをつかって


hairetu[0]内に格納されている数値1をprintf出力表示する命令文


を作製、実行してみます。


#include <stdio.h>


int main(void){


int hairetu[]={1,2,3};

printf("%p\n",&hairetu[0]);

/*まずは hairetu[0]のアドレス&hairetu[0]をprintf出力表示してみます。*/


printf("%p\n",hairetu);

/*次はポインタ変数hairetuに格納されているアドレスをprintf出力表示します*/


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

/* ここで*hairetuはアドレス&hairetu[0]のメモリに格納されている数値を表しており

配列変数

hairetu[0]に格納されている数値1をprintf出力表示しようとしています*/


return 0;

}


(EAZY IDECの場合)


コンパイル結果

0019FF4C

0019FF4C

1


(Visual Studioの場合)


00BBF818

00BBF818

1


いかがでしたか


*hairetuはアドレス&hairetu[0]のメモリに格納されている数値1を表しています


つまり


       😊*hairetu=hairetu[0]😊


なんです



そんなにむずかしくないと思われます。


ポインタ変数であるhairetuは


すでに数値1が格納されている配列変数hairetu[0]のアドレスが


代入されて 初期化されているというだけで


普通のポインタ変数と使い方は一緒です😚。」


ソーラー「このhairetu+1というのは・・・」


アレサ「このhairetu+1、hairetu+2というのは


配列変数

hairetu[1]

hairetu[2]

のアドレスをすでに格納しているポインタ変数です。


使い方はhairetuと同じですね。



       😊*(hairetu+1)=hairetu[1]😊

       😊*(hairetu+2)=hairetu[2]😊



をあらわすことになります


注意点としては


ポインタ変数hairetu+2をつかって


配列変数hairetu[2]に格納されている数値を求めるとき


すなわち、*演算子をポインタ変数hairetu+2に作用させ


hairetu[2]内に格納されている数値を求めるとき


printf("%d\n",*hairetu+2);

でなく

printf("%d\n",*(hairetu+2));と表記するところですの。


ソーラー 「どこ、どこ?」


アレサ「ここ、ここっ お父様っ


printf("%d\n",*hairetu+2);

でなく

printf("%d\n",*(hairetu+2)); 👈👈


hairetu+2が(hairetu+2)と囲ってあるところがポイントです。


この2つの命令文


printf("%d\n",*hairetu+2);

printf("%d\n",*(hairetu+2)); 


を同時にコンパイルしてみます。


どのような違いがみられるでしょうか?」


ソーラー「な、なんて まぎらわしい・・・」


アレサ「ソーラーさん、さあ、


コンパイル結果はどうなるのでしょうか?


ここでは、わかりやすく説明するために


int hairetu[3]={1,2,3};から

int hairetu[3]={11,112,1113};に


配列に格納される数値を変化させてプログラムを構成してみました」


#include <stdio.h>


int main(void){


int hairetu[3]={11,112,1113};

printf("%d\n",*hairetu+2);

printf("%d\n",*(hairetu+2));


return 0;

}

コンパイル結果

13

1113


アレサ

「hairetu+2を()で括ったのと、


そうでないのとでは


違いがでてきました。


2つ目の命令文

printf("%d\n",*(hairetu+2);

では

配列変数

hairetu[2]に格納されている1113が表示され


1つ目の命令文

printf("%d\n",*hairetu+2);

では


*hairetuに格納されている数値

つまり

配列変数hairetu[0]に格納されている11に


2がプラスされて13がprintf出力表示されているというわけです。」


ソーラー「とりあえず、これで


配列とポインタ変数の関係は簡単です


の本当の意味がわかったね。


つまり


配列が作製された時点で


配列に対応する


ポインタ変数も自動的につくられていて


自分で作成する必要がなく


簡単さってことなんだね😇」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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