修正:
ポインタアドレスとポインタが指すアドレスの概念をめちゃくちゃにしてしまったので、以下のコードを修正しました。そして今、私が望むものを出力します。変数a、c、i、j、k、pはスタック上にあり、変数b、dはヒープ上にあります。静的変数とグローバル変数は別のセグメントにあります。皆様、どうもありがとうございました!
これら 2 つの概念が深く議論されていることは知っていますが、次のコードについてはまだ疑問があります。
#include <iostream>
using namespace std;
class A {
};
int N = 10;
void f(int p) {
int j = 1;
float k = 2.0;
A c;
A* d = new A();
static int l = 23;
static int m = 24;
cout << "&c: " << &c << endl;
cout << "&d: " << d << endl;
cout << "&j: " << &j << endl;
cout << "&k: " << &k << endl;
cout << "&l: " << &l << endl;
cout << "&m: " << &m << endl;
cout << "&p: " << &p << endl;
}
int main() {
int i = 0;
A* a;
A* b = new A();
cout << "&a: " << &a << endl;
cout << "&b: " << b << endl;
cout << "&i: " << &i << endl;
cout << "&N: " << &N << endl;
f(10);
return 0;
}
私の結果は次のとおりです。
&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00
これは非常に興味深いことです。なぜなら、グローバル変数 N と、関数 f の 2 つの静的変数 (l と m) を除いて、他のすべての変数のアドレスが一緒になっているように見えるからです。(注: コードと結果は変更されており、ここに記載されている内容とは一致しません。)
スタックとヒープについてよく調べました。「new」でオブジェクトを作成した場合、それはヒープ上にあるというのが常識です。また、ローカル変数 (上記のサンプルの j や k など) はスタックにあります。しかし、私の例ではそうではないようです。それは異なるコンパイラに依存していますか、それとも私の理解が間違っていますか?
皆様、どうもありがとうございました。