配列には自分でポインタ変数を作製しなくとも配列を作った時点で配列専用のポインタ変数が用意されています
てんC「さきほどは配列変数hairetu[0]に
対応するポインタ変数pthairetu[0]を作りましたが
うまく機能せず
無駄に失敗におわりました。」
ソーラー「さらっと無駄っていっちゃたよぉ~~~」
てんC 「実は、配列には
配列宣言を行ったなら
配列変数に対応する
ポインタ変数が自動的に用意されているのです。
具体例をみていきましょう。
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]をつくってもうまく機能しないのです。😝
ソーラーさん」
ソーラー 「おぉぉ・・・ こ~ほ~」
てんC「
この3つのポインタ変数
hairetu
hairetu+1
hairetu+2
のなかでも
hairetu[0]のアドレスである&hairetu[0]が格納されて初期化されている
hairetu[0]に対応するポインタ変数
hairetu
をつかってプログラムを構成してみましょう。
代表的な2つの命令文
ポインタ変数hairetuに格納されているアドレスを
cout出力表示する命令文と
ポインタ変数hairetuに*演算子を作用させた
*hairetuをつかって
hairetu[0]内に格納されている数値1をcout出力表示する命令文
を作製、実行してみます。」
#include <iostream>
using namespace std;
int main() {
int hairetu[]={1,2,3};
cout<<&hairetu[0]<<"\n";
/*まずは hairetu[0]のアドレス&hairetu[0]をcout出力表示してみます。*/
cout<<hairetu<<"\n";
/*次はポインタ変数hairetuに格納されているアドレスをcout出力表示します*/
/*C言語では
アドレスを出力表示するなら%p出力変換指定子
数値を出力表示するなら%d出力変換指定子
文字を出力表示するなら%c出力変換指定子
が必要だったけど
C++言語では
出力するデータに合わせて出力変換指定子を変えなくてもよいのでcoutは便利ですね*/
cout<<*hairetu<<"\n";
/* ここで*hairetuはアドレス&hairetu[0]に格納されている数値を表しており
配列変数
hairetu[0]
に格納されている数値1をcout出力表示しようとしています*/
return 0;
}
ビルド実行結果
0055FB68
0055FB68
1
てんC「いかがでしたか
そんなにむずかしくないと思われます。
ポインタ変数であるhairetuは
すでに数値1が格納されている配列変数hairetu[0]のアドレス
&hairetu[0]が代入されて 初期化されているというだけで
普通のポインタ変数と使い方は一緒です😚。」
ソーラー「このhairetu+1というのは・・・」
てんC「この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]内に格納されている数値を求めるとき
cout<<*hairetu+2<<"\n";
でなく
cout<<*(hairetu+2)<<"\n";
と表記します。
ソーラー 「どこ、どこ?」
cout<<*hairetu+2<<"\n";
でなく
cout<<*(hairetu+2)<<"\n";👈👈
hairetu+2が(hairetu+2)と囲ってあるところがポイントです。
この2つの命令文
cout<<*hairetu+2<<"\n";
cout<<*(hairetu+2)<<"\n";
を同時にビルド実行してみます。
どのような違いがみられるでしょうか?」
ソーラー「違いか・・・う~ん」
てんC「ソーラーさん、さあ、
ビルド実行結果はどうなるのでしょうか?
ここでは、わかりやすく説明するために
int hairetu[3]={1,2,3};から
int hairetu[3]={11,112,1113};に
配列hairetuに格納される数値を変化させてプログラムを構成してみました」
#include <iostream>
using namespace std;
int main() {
int hairetu[]={11,112,1113};
cout<<*hairetu+2<<"\n";
cout<<*(hairetu+2)<<"\n";
return 0;
}
ビルド実行結果
13
1113
てんC
「hairetu+2を()で括ったのと、
そうでないのとでは
違いがでてきました。
2つ目の命令文
cout<<*(hairetu+2)<<"\n";
では
配列変数
hairetu[2]
に格納されている1113が表示され
1つ目の命令文
cout<<*hairetu+2<<"\n";
では
*hairetuに格納されている数値
つまり
配列変数hairetu[0]に格納されている11に
2がプラスされて13がcout出力表示されているというわけです。」
ソーラー「とりあえず、これで
配列とポインタ変数の関係は簡単です
の本当の意味がわかったね。
つまり
配列が作製された時点で
配列に対応する
ポインタ変数も自動的につくられていて
自分で作成する必要がなく
簡単さってことなんだね😇」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます