修改/修改数组访问

时间:2018-09-12 17:23:56

标签: c++

我有一个字节数组,我想更改其访问方式。这是数组:

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 **传递给不受控制的库。

谢谢!

1 个答案:

答案 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个元素的指针。