我正在尝试使用 std::vector
作为 char
数组 .
我的函数接受一个void指针:
void process_data(const void *data);
在我刚刚使用此代码之前:
char something[] = "my data here";
process_data(something);
哪个按预期工作 .
但是现在我需要 std::vector
的动态性,所以我尝试了这个代码:
vector<char> something;
*cut*
process_data(something);
问题是,如何将char矢量传递给我的函数,以便我可以访问矢量原始数据(无论它是哪种格式 - 浮点数等)?
我试过这个:
process_data(&something);
还有这个:
process_data(&something.begin());
但它返回了指向乱码数据的指针,后者发出了警告: warning C4238: nonstandard extension used : class rvalue used as lvalue
.
3 回答
&something
为您提供std::vector
对象的地址,而不是它所拥有的数据的地址 .&something.begin()
为您提供begin()
返回的迭代器的地址(正如编译器警告的那样,这在技术上是不允许的,因为something.begin()
是一个右值表达式,因此无法获取其地址) .假设容器中至少有一个元素,您需要获取容器的初始元素的地址,您可以通过该地址获取
&something[0]
或&something.front()
(索引0处元素的地址),或&*something.begin()
(由begin()
返回的迭代器指向的元素的地址) .在C 11中,一个新的成员函数被添加到
std::vector
:data()
. 此成员函数返回容器中初始元素的地址,就像&something.front()
一样 . 这个成员函数的优点是即使容器为空也可以调用它 .something.data()
将返回指向向量数据空间的指针 .改为使用指向第一个元素的指针: