我有一个字节数组,我想更改其访问方式。这是数组:
char bytes[100];
我想拥有另一个更改原始数组访问方式的数组。如果我们可以将引用放在数组中,它将看起来像这样:
char& bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}
尽管引用数组无效。我想出了这个理论上可以实现我想要的东西:
#include <iostream>
struct Byte {
char* ref;
Byte(){}
Byte(char& c){
ref = &c;
}
operator char&() const {
return *ref;
}
};
int main(){
char bytes[100];
Byte bytes_ref[50];
for(size_t i = 0; i < 50; i++){
bytes_ref[i] = bytes[i * 2];
}
}
尽管这按我想要的方式工作,但占用了大量空间。
是否有某种方法可以在不消耗每个条目7个以上字节的情况下执行此操作?我的本能不是,但我希望C ++中可能有某种特殊功能可以做到这一点,或者可以进行一些直接的内存操作和访问。
我要这样做的原因是我有一个字节数组,用于表示NV21格式的图像。我想创建一个单独的数组,该数组引用原始缓冲区中的字节,但占用一半的像素,从而有效地动态调整图像的大小。
我必须将char **传递给不受控制的库。
谢谢!
答案 0 :(得分:1)
我认为您不能使用少于每个元素一个指针的内存
如果您需要将char*
的数组传递给不受控制的库,那么我知道您必须分配整个数组,因为那是该库所期望的。该代码想要:
std::array<char*, 50> bytes_ref;
for(size_t i = 0; i < bytes_ref.size(); ++i){
bytes_ref[i] = &bytes[i * 2];
}
然后,您可以将数组传递为:
f(bytes_ref.data());
如果您不需要使用char**
,则将有更多选择。您可以使用std::reference_wrapper
,尽管其大小类似于指针。如果您始终必须跳过2个元素,则可以为此创建一个对象。例如:
class Wrapper {
public:
Wrapper(char *origin) : m_origin(origin) {}
char* operator[](size_t index) {return m_origin + 2*index;}
private:
char *m_origin;
};
上面的代码将使用[]运算符返回每2个元素的指针。