はい、アドレスを一時 (つまりスタック) オブジェクトに戻し、それをポインターに割り当てることができます。ただし、コンパイラは、現在のスコープが終了する前に、実際にオブジェクトを破棄する (つまり、メモリ内のそのセクションを上書きする) 場合があります。(明確にするために: これは決してこれをしないことを意味します。)異なるオペレーティング システム上の異なるバージョンの GCC で観察される動作については、以下のコメントの説明を参照してください。(バージョン 4.5.3 がエラーではなく警告のみを表示するという事実が、コンパイルした場合にポインターが現在のスコープ内のどこでも有効であるという意味で、これが常に「安全」であることを示しているかどうかはわかりませんその特定のバージョンの GCC を使用しますが、私はそれを期待しません。)
これが私が使用したコードです(Jonathan Lefflerの提案に従って変更されました):
#include <stdio.h>
class Class {
public:
int a;
int b;
Class(int va, int vb){a = va; b = vb;}
};
int main(){
Class *p = &Class(1, 2);
Class *q = &Class(3, 4);
printf("%p: %d,%d\n", (void *)p, p->a, p->b);
printf("%p: %d,%d\n", (void *)q, q->a, q->b);
}
GCC 4.5.3 を使用してコンパイルし、(Windows 7 SP1 上で) 実行すると、このコードは次のように出力されます。
0x28ac28: 1,2
0x28ac30: 3,4
GCC 4.7.1 を使用してコンパイルし、(Mac OS X 10.8.3 上で) 実行すると、次のように出力されました。
0x7fff51cd04c0: 0,0
0x7fff51cd04d0: 1372390648,32767
いずれにせよ、変数を通常どおりに宣言して、「ポインターのような」ものが必要なすべての場所で使用しない理由がわかりません&v
(たとえば、引数としてポインターを必要とする関数など)。