从std :: vector<>转换一个双指针?

时间:2012-07-03 02:27:47

标签: c++ pointers casting stdvector

我是出于好奇而想知道是否有可能施放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;

但它不起作用。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:8)

您已经知道&myCharVector[0]是指向char的指针。因此,如果将其存储在变量中:

char *cstr = &myCharVector[0];

然后你可以获取该变量的地址:

char **ptrToCstr = &cstr;

但这样只需解除引用两次:

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

无效,因为值(&myCharVector[0])尚未存储在内存中。

答案 1 :(得分:3)

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

您能够执行char *myCharPointer = &myCharVector[0]的原因是myCharVector[0]为您提供了char,因此&myCharVector[0]会为您提供char的地址,您可以将其分配给char *

将完整std::vector转换为char *(不是char **)的唯一方法是循环std::vector并从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

然后char将是{{1}} s的C字符串。

答案 2 :(得分:2)

在C ++ 11中,你可以这样做:

char *myCharPointer = myCharVector.data();

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

如果目的是能够改变指针指向的内容,那么你可能真的需要一个指向向量的指针,而不是指向指向char的指针。但是,STL不允许您更改向量本身内的基础指针,而无需通过常规向量API(如resizeswap)。