使用线性存储来实现2D阵列

时间:2018-04-02 22:28:02

标签: c++ memory multidimensional-array storage

我需要创建一个有助于在C ++中使用线性存储实现2D数组的函数。这些函数中的第一个是two_d_store(),它将以下参数作为参数:用作2D数组的区域的内存中的基地址,数组条目的字节大小,2个数组维度和2个索引值。使用此two_d_store()函数:

int d[10][20];
d[4][0] = 576;

可以替换为

char d[200*sizeof(int)];
two_d_store(d, sizeof(int), 10, 20, 4, 0, 576);

那么有一种简单的方法可以在不使用数组的情况下实现这个功能吗?

2 个答案:

答案 0 :(得分:0)

我将最后一个参数更改为指针,而不是值,bcs我们不知道它是什么类型。不需要max_y参数。首先,我在n_array_ptr上计算我们想要更改的单元格的地址,然后将new_value指针中的size_of_type字节memcpy到n_array_ptr。这个函数可以用于所有类型的数组,bcs我们将它转​​换为void *并计算我们的单元格开始的块的地址,并复制大小的size_of_type字节。

#include <iostream>
#include <cstring>

using namespace std;

void two_d_store(void * array_ptr, size_t size_of_type, int max_y, int max_x, int y, int x, void* new_value) {
    void * n_array_ptr = array_ptr + size_of_type * (y * max_x + x);
    memcpy(n_array_ptr, new_value, size_of_type);
}

int main() {
    int d[10*20];
    int new_val = 576;
    two_d_store(d, sizeof(int), 10, 20, 4, 0, &new_val);
    cout<<d[4*20]; //[4][20]
    return 0;
}

答案 1 :(得分:0)

对于任何奇怪或没有理由,如果你不想使用标准方式来访问或设置你的内存结构,你可以使用 memcpy(void *dst, const void *src, size_t len); 它是一个C函数,但它也适用于C ++ 100%。

以下是我发现的一些常规内存处理功能,祝你好运!:

void *memchr(const void *ptr, int ch, size_t len)

memchr在ptr中找到ch的第一个出现并返回指向它的指针(如果在第一个len字节中找不到ch,则返回空指针

int memcmp(const void *ptr1, const void *ptr2, size_t len)

memcmp与strcmp类似,只是等于0的字节不被视为比较终止符。

void *memcpy(void *dst, const void *src, size_t len)

memcpy将len字符从src复制到dst并返回dst的原始值 如果src和dst指向内存的重叠区域

,则memcpy的结果是不确定的
void *memmove(void *dst, const void *src, size_t len)
memmove就像memcpy,只要memmove保证即使内存区重叠也能正常工作

void *memset(void *ptr, int byteval, size_t len)

memset将ptr指向的内存区域的前len个字节设置为byteval指定的值