1

以下のコードを参照してください。

#include <vector>
#include <iostream>
int main(int argc, char *argv[]) {
  std::vector<double> obj(10,0);
  std::cout << &obj << std::endl;
  std::cout << &obj[0] << std::endl;
}

この 2 つのアドレスの違いを知りたいです。よろしくお願いします。私が知っているようa[5]に、&a<=> &a[0]<=>のような配列の場合a

4

4 に答える 4

7

&objはベクター自体のアドレスで、 は&obj[0]ベクター内のデータのアドレスです。配列はそれらに格納されたデータにすぎないため、配列のアドレスはその中のデータのアドレスと事実上同じですが、ベクトルはその内部データをヒープに割り当てます。

于 2012-07-27T09:58:22.247 に答える
2

たぶんこれが役立つ

struct MyVector
{
  double* data;
};

int main
{
  MyVector obj;
  cout << &obj << std::endl;
  cout << obj.data << std::endl;
}

明らかに (私は願っています) 2 つのポインターは異なります。std::vector と同じです。

于 2012-07-27T10:10:14.570 に答える
1

&obj は、スタック上のベクトルのアドレスです。そのタイプは「ベクターへのポインター」( std::vector* )です。&obj[0] は、ベクターに格納された最初の double のアドレスであり、「double へのポインター」(double*) 型です。

于 2012-07-27T10:01:53.230 に答える
1

std::vector と配列の非常に基本的な違いを誤解しているように感じます。私が言いたいのは、例えば

int i_array [ 5 ] = { 0 };

はベクトルではありません。ベクトルはクラスであり、i_array は単に配列の最初の整数へのポインターです。(また、ポインターで [] を使用することは、ベクトル オブジェクトで [] を使用することと同じではありません) ベクトルの [] 演算子を使用している間、最初の整数 (または double への参照を返すクラスの関数にアクセスしているだけです)あなたの場合)クラスベクトルによって管理される配列の。

したがって、 &obj はベクトルのインスタンス、オブジェクト「this」のポインターを提供しますが、 &obj[0] は最初に配列の最初のエントリへの参照を返す演算子 [] を呼び出し、 & を使用してのアドレスを取得しますそれ。

于 2012-07-27T10:39:47.480 に答える