2011-07-22 9 views
7

私は謝罪しますが、ポインターや配列などには100万の質問がありますが、これは基本的なものですが、私は答えに何かを見つけることができないようです。ポインタのアドレスを取得する

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 

実際にある:

私はメモリのチャンクを指すように初期化されるポインタを持っている

、私はどのように私は配列を希望に似た、このメモリにアクセスすることができることを理解します配列ではない私は、その要素がMMEM考慮全く正しい言葉ではありません知っています - -

char *mMem=new char[5000]; 
cout<<*(mMem+5)<<endl; 

は何私も理解していないこと要素のアドレスを取得する方法である私の理解である場合、それはです正しいですが、あまりにも確かなことはできませんポインタと配列について言えば、あらゆるサイトが必要とする単語をすべてのサイトで使用しているようです。だから、私が持っている場合:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 
    or 
cout<<*(mMem+5)<<endl; 

なぜオペレータのアドレスが正しく動作しません:

cout<<&mMem[5]<<endl; 

代わりに第五要素のアドレスを取得する、私はメモリブロックの内容のプリントアウトを取得しますその要素から以降。だから、なぜ私は予想していたように、演算子のアドレスが動作しませんでした、どのように私はメモリの要素のアドレスを取得できますか?

答えて

14

&mMem[5]は、の5番目の要素のアドレスです。そこからメモリのプリントアウトを得るのは、&mMem[5]のタイプがchar*であるためです。しかし、レガシーCの文字列もchar*であるため、<<演算子は単にそこから文字列を出力したいと考えています。私は、印刷前にvoid*へのポインタをキャストしようとするだろう:

cout << static_cast<void*>(&mMem[5]) << endl; 

ところで、&mMem[5]mMem+5はちょうど同じです。

4

要素5のアドレスが期待どおりに取得されていますが、char *の印刷機能のcoutは、ポインタ値ではなくそのメモリ位置に文字列の内容を出力します。

ポインタをint:cout << (int)&mMem[5];にキャストすると、アドレスが表示されます。

関連する問題