4

std::vector<> を double ポインターにキャストできるかどうか、好奇心から疑問に思っていました。

この方法で std::vector をポインターとして渡す際に問題が発生したことはありません。

std::vector<char> myCharVector;
myCharVector.push_back('a');
myCharVector.push_back('b');
myCharVector.push_back('c');
char *myCharPointer = &myCharVector[0];

したがって、これと同様の方法でポインターのアドレスを割り当てることができるかどうかに興味がありました。

char *myPointer = "abc";
char **myDoublePointer = &myPointer; 

私はもう試した:

char **myDoublePointer = (char**)&myCharVector;

しかし、うまくいきません。これを達成する方法はありますか?

4

3 に答える 3

8

&myCharVector[0]がへのポインタであることは既にご存じでしょうchar。したがって、変数に格納する場合:

char *cstr = &myCharVector[0];

次に、その変数のアドレスを取得できます。

char **ptrToCstr = &cstr;

ただし、次のように 2 回逆参照するだけです。

char **ptrToCstr = &(&myCharVector[0])

(&myCharVector[0])がまだメモリに保存されていないため、無効です。

于 2012-07-03T02:33:56.230 に答える
4

C++11 では、次のことができます。

char *myCharPointer = myCharVector.data();

ただし、戻り値のアドレスを取得することはできませんdata()。これは、基になるストレージへの参照を返さず、ポインター値のみを返すためです。

目的がポインターが指すものを変更できるようにすることである場合、char へのポインターへのポインターではなく、ベクターへのポインターが本当に必要になる場合があります。ただし、 では、通常のベクター API (や など)STLを使用せずに、ベクター自体の基になるポインターを変更することはできません。resizeswap

于 2012-07-03T02:47:42.393 に答える
3

あなたは間違いなくこれを行うことはできません. std::vectorと achar **はまったく異なるタイプのオブジェクトであり、単に「キャスト」することはできません。

あなたができた理由char *myCharPointer = &myCharVector[0]は、それmyCharVector[0]があなたにを与えchar、したがって&myCharVector[0]そのアドレスを与えchar、それを に割り当てることができるからchar *です。

std::vectorフルをchar *(not ) に変換できる唯一の方法は、データを手動でchar **ループして、データからstd::vectora を構築することです。char *

たとえば、次のようなものです。

char *ptr = malloc(myCharVector.size()+1);
for (unsigned int i=0; i < myCharVector.size(); i++) {
  ptr[i] = myCharVector[i];
}
ptr[myCharVector.size()] = 0;

次に、s のptrC 文字列になりますchar

于 2012-07-03T02:30:48.210 に答える