4

出于好奇,我想知道是否可以将 std::vector<> 转换为双指针。

我从来没有遇到过以这种方式将 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;

但是像这样简单地取消引用两次:

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

无效,因为该值(&myCharVector[0])尚未存储在任何地方的内存中。

于 2012-07-03T02:33:56.230 回答
4

在 C++11 中,您可以执行以下操作:

char *myCharPointer = myCharVector.data();

但是您不能获取返回值的地址,data()因为它不返回对底层存储的引用,而只是返回指针值。

如果目的是能够更改指针所指向的内容,那么您可能真的想要一个指向向量的指针,而不是指向指向 char 的指针的指针。但是,STL不允许您在不通过常规矢量 API(如resizeor swap)的情况下更改矢量本身内的基础指针。

于 2012-07-03T02:47:42.393 回答
3

你绝对不能这样做。std::vector和 achar **是完全不同类型的对象,您不能只是将一个对象“投射”到另一个对象。

你能够这样做的原因char *myCharPointer = &myCharVector[0]是它myCharVector[0]给了你 a char,从而&myCharVector[0]给了你那个地址,char你可以将它分配给 a char *

您可以将 fullstd::vector转换为char *(not char **) 的唯一方法是循环您并手动从数据std::vector构造 a 。char *

例如:

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

然后ptr将是chars 的 C 字符串。

于 2012-07-03T02:30:48.210 回答