我是出于好奇而想知道是否有可能施放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;
但它不起作用。有没有办法实现这个目标?
答案 0 :(得分:8)
您已经知道&myCharVector[0]
是指向char
的指针。因此,如果将其存储在变量中:
char *cstr = &myCharVector[0];
然后你可以获取该变量的地址:
char **ptrToCstr = &cstr;
但这样只需解除引用两次:
char **ptrToCstr = &(&myCharVector[0])
无效,因为值(&myCharVector[0])
尚未存储在内存中。
答案 1 :(得分:3)
你绝对不能这样做。 std::vector
和char **
是完全不同类型的对象,您不能只是将其“投射”到另一个。
您能够执行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(如resize
或swap
)。