2017年09月24日
《その46》 ポインタと配列
原則として、配列名は、その配列の先頭要素へのポインタと解釈される。 (p.254)
あまりピンとこないので、自分なりに少し確認してみます。
int a[10];
の場合なら、a は 配列aの先頭要素a[0] へのポインタであるということです。
ポインタの値は、そのポインタが指しているオブジェクトのアドレスなので、
cout << a << '\n';
cout << &a[0] << '\n';
は、同じアドレスを表示するはずです。
&配列名は、「配列全体」へのポインタとなります。 (p.254)
&a は配列a全体を指すポインタということです。つまり、&a の値は、配列aというオブジェクトのアドレスです。
cout << &a << '\n';
は、どんなアドレスを表示するのか・・・。
配列aの先頭要素a[0] へのポインタ と 配列a全体へのポインタ は、同じアドレスのような気もするし、違うのかも という気もします。
プログラムで確認してみました。
#include <iostream>
using namespace std;
int main()
{
int a[10];
cout << "a :" << a << '\n';
cout << "&a[0]:" << &a[0] << '\n';
cout << "&a :" << &a << '\n';
cout << "sizeof(*a) :" << sizeof(*a) << '\n';
cout << "sizeof(*&a):" << sizeof(*&a) << '\n';
}
a と&a[0] は当然ですが、同じ値でした。
そして、&a も同じ値でした。この結果は、やっぱりな という気もしますが、自分としては、なんとなく理解しづらいところもあります。
でも、素直に納得することにします。
sizeof(*a) は int型整数a[0] の大きさで、sizeof(*&a) は 配列全体(int型整数10個分)の大きさなので、
sizeof(*a) が 4で、sizeof(*&a) が 40というのは、スッキリする結果ですね。
配列名が、sizeof演算子およびtypeid演算子のオペランドとして現れたときは、配列全体の大きさや情報を生成します。 (p.254)
上の例でいえば、sizeof(a)は 40ということになります。このときの a は、配列の先頭要素へのポインタではありません。
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6736933
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック