我需要创建一个有助于在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);
那么有一种简单的方法可以在不使用数组的情况下实现这个功能吗?
答案 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指定的值