1

この簡単なプログラムがあるとしましょう

#include <iostream>
using namespace std;

struct teststruct
{
   int n;
   long l;
   string str;
};

int main()
{
   teststruct wc;

   wc.n = 1;
   wc.l = 1.0;
   wc.str = "hello world";

   //cout << wc << endl; // what is wc by itself?
   cout << &wc;  // contains the memory address to the struct?
   return 0;
}

私はwcに何があるのか​​理解しようとしていますか?変数名wcで構造体型を宣言すると; wcとは何ですか?メモリアドレスへのポインタですか?内容を確認しようとしましたが、コードでエラーが発生します。wcとは何かを明確にしていただけますか

4

4 に答える 4

10

トイレとは何ですか?メモリアドレスへのポインタですか?

いいえ、 のすべてのメンバーを格納するのに十分な大きさのストレージの塊ですteststruct

この場合、自動ストレージがあります。つまり、それを含むコード ブロックが続く限り、この場合は の最後まで続きmain()ます。格納場所の詳細は実装固有ですが、実際には通常、関数の開始時に作成され、関数の終了時に破棄されるスレッドのスタック (スタック フレーム) の一時領域に格納されます。

そのストレージ内でメンバーがどのように配置されるかの正確な詳細も、実装固有です。

内容を調べてみましたが、コードでエラーが発生します。

<<これは、演算子がオーバーロードされた型に対してのみ機能します。標準ライブラリは、すべての基本的な型とポインター、および のような一部のライブラリ型に対してこれを行いますstd::string。ただし、独自の型のサポートが必要な場合は、独自のオーバーロードを指定する必要があります。次に例を示します。

std::ostream & operator<<(std::ostream & s, teststruct const & t) {
    return s << t.n << ',' << t.l << ',' << t.str;
}

cout << wc << endl; // prints "1,1,hello world"
于 2012-07-03T19:15:20.260 に答える
5

wcteststruct自動ストレージを持つ型のインスタンスです。他のすべての詳細は実装固有ですが、ほとんどの場合、実装は自動ストレージ領域としてスタックを使用します。

&wcは 型の式teststruct *で、結果はwcのアドレスになります。

質問されていない質問については (質問してみませんか?): 構造体の内容を出力するには、そのメンバーを 1 つずつ出力する必要があります。

cout << wc.n << ", " << wc.l << ", " << wc.str << endl;

しかし、あなたのコードには誤解があるようです。1.0type のリテラルfloat、つまり浮動小数点数です。long変数に格納したいものでよろしいですか?longリテラルが必要な場合は、を使用します1L

于 2012-07-03T19:06:41.683 に答える
0

のインスタンスはteststruct、メンバー変数の値を格納するために使用されるメモリの連続した領域と考えてください。印刷するとき

    cout << &wc;

変数のアドレス、つまり変数が格納されているメモリ内の場所を出力しています。これは単純化された回答であり、詳細な技術的エラーが含まれている可能性がありますが、質問の性質と言葉遣いから、役に立つイメージを描くことができると思われます。

于 2012-07-03T19:14:14.767 に答える
0

wcteststructスタックに割り当てられた型のオブジェクトです

于 2012-07-03T19:06:16.263 に答える