参照のポインタ型というもの自体ありえません。"\n";}実行結果:004FF7B8004FF7AC004FF79C004FF7B8この実行結果は環境によってまったく異なるものになりますし、同じ環境でも、実行するたびに変化する可能性があります。16進数による表記になります。16進数に馴染みがない方は、コンピュータサイエンス編>「基数」のページを参照してください。いうメモリアドレスに配置されていることが分かります。4バイト分のメモリを消費しています(004FF7B8~004FF7BB)。方が小さいので、変数を定義した順番どおりにメモリアドレスが増えていくわけではないことも分かります。値はうまく出力できません。いう型にキャストしてください。今度は構造体にまとめてみます。ような記述で取得できます。C言語的な意味での構造体であれば、データメンバのオブジェクトは、宣言された順番どおりにメモリ上に配置されます4。実行結果からもそれが分かります。構造体変数そのもののメモリアドレスと、先頭のデータメンバのメモリアドレスが同じであることも分かります。ないデータメンバに限られています。データメンバどうしの間隔が開く場合があります4。4バイト開いていることが分かります。これは効率の向上や、実行環境の都合などの理由でコンパイラが行う調整によるものです。パディングが追加された場合には、構造体型の大きさは、すべてのデータメンバの大きさを足し合わせたものよりも大きくなります。【上級】データメンバの順番に重大な意味がないのならば、大きいほうから順に並べるようにすることで、パディングが入る量を抑えられます。offsetofマクロC言語的な意味合いでの構造体であれば、データメンバがその構造体の先頭から何バイト目のところにあるかを、offsetofマクロを使って調べられます。関数形式マクロになっており、次のように使います。データメンバ名)型名とデータメンバ名が分かればいいので、構造体型の変数を定義する必要はありません。結果は、std::size_t型で返されます。【上級】offsetofマクロの対象が、標準レイアウトクラスと呼ばれる形式に合致する構造体型でない場合は未定義の動作になります。静的データメンバやメンバ関数に対する使用も未定義の動作です5。配列の場合を確認します。自身のメモリアドレスだけは全然違う数値になりますが、配列の各要素はメモリ上で隙間なく連続的に並びます6。この特性は、配列のメモリ上での表現を理解するうえで非常に重要です。アラインメントオブジェクトが配置されるメモリアドレスには、型に応じた制約があります。アラインメントは整数値であり、オブジェクトは、メモリアドレスがこの数値の倍数になるように配置されます。倍数のところに制約されます。このような制約が課せられている意味は、オブジェクトにアクセスする効率を高めることや、環境によっては一定の倍数のアドレスでなければアクセス自体ができないといった事情に対応することです。いった事情は環境によって異なるため、どの型にどんなアラインメントが設定されるかは処理系定義になっています。alignof(型名)得られる値は、std::size_t型の定数です。アラインメントは、sizeof演算子で取得できる大きさと一致します。あることに注目しましょう。なりそうですが、そうはなりません。