最近、いくつかのポインターの値をコンソールに出力して、小さなプログラムのデバッグを試みました。1 つ目は構造体のメモリ アドレスで、残りはそのフィールドのメモリ アドレスでした。コードの簡素化されたバージョンは次のとおりです。
#include <iostream>
struct testingPointers
{
int i;
float f;
double d;
} test;
int main()
{
std::cout << &test << '\n' << &(test.i) << '\n' <<
&(test.f) << '\n' << &(test.d);
}
出力は次のとおりです。
0x681110
0x681110
0x681114
0x681118
(明らかに、正確な値は実行ごとに異なりますが、互いに相対的な位置は常に同じです)。
最初のポインタの値 ( のメモリ位置) がtest
2 番目のポインタ ( の最初のフィールド) の値と同じであるため、混乱していますtest
。これは、オブジェクトには真の一意のメモリ アドレスがなく、構造体またはクラスへのポインターが単に最初のフィールドを指していることを意味するのでしょうか? もしそうなら、どのようにステートメントは
a.b
a->b
a.b()
a
が実際には最初のフィールドにすぎず、フィールドやメソッドがない場合は意味がありますか?