0

假设我有一个unsigned int* valand unsigned char mat[24][8]。现在val存储变量的位置mat。是否可以使用中的位置修改 mat 变量中的位val

例如:

val = 0x00000001并且val在内存中的位置是位于0x20004000 的第一个元素。mat0x00000001

现在我想修改matat 的值,比如 10,4。是否可以使用 C++ 做到这一点?

4

4 回答 4

2

是的,这是可能的,除非数组成员或指针目标是const.

例如:

int array[3][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
int *p = &array[1][1];
*p = 42;

// array is now: { { 0, 1 }, { 2, 42 }, { 4, 5 } };
于 2013-05-08T12:15:28.497 回答
0

是的,您可以使用地址(您所谓的位置)更改矩阵的值,但您必须从一开始就计算正确的偏移量。偏移量计算应该是这样的:

(matrix_x_len * Y + X) * sizeof(unsigned int) + offset to the beggining of the matrix

然后当你有偏移量时,你可以像这样改变垫子:*(val + offset) = new_value

于 2013-05-08T12:14:46.470 回答
0

您当然可以修改这些位,因为unsigned char mat[24][8]为您提供了一个 24*8*sizeof(char) 字节的内存块。(我假设 unsigned char 的大小是 1 个字节(=8 位),而 unsigned int 是 4 个字节(=32 位),但这可能取决于您的系统。

但是使用指向 4 字节宽度的元素的指针访问 1 字节宽度的内存元素是很棘手的,并且很容易产生错误。

例如,如果将 int 数组的元素 0 设置为 1

#define ROWS 24
#define COLS 8

unsigned char mat[ROWS][COLS];
unsigned int * val = (unsigned int*)&mat;

val[0] = 1;

您将看到 mat[0][0] 为 0,mat[0][1] 为 0,mat[0][2] 为 0,mat[0][3] 为 1。

请注意,您不能通过这种“未键入”指针直接使用它们在内存中的偏移量来编辑 mat 的元素。例如,访问val[10*8+4]将从只有 192 个字节的内存块的开头访问字节 336。

您必须正确计算您的指数:

size_t byte_index = (10*COLS+4)*sizeof(unsigned char); // will be 84
size_t int_index = byte_index / sizeof(unsigned int); // will be 21
size_t sub_byte = byte_index%sizeof(unsigned int); // will be 0

因此,您可以访问val[int_index]val[21]访问包含元素 mat[10][4] 数据的 4 个字节,它是sub_byte引用的 unsigned int 值的字节数。

如果你有相同的类型,除了你需要计算正确的偏移量之外没有问题。

#define ROWS 24
#define COLS 8

unsigned char mat[ROWS][COLS];
unsigned char * val = &mat;

val[10*8+4] = 12; // set mat[10][4] to 12
*(val+10*8+5) = 13; // set mat[10][5] to 13
于 2013-05-08T12:16:56.250 回答
0

可以,但将 val 设为unsigned char *

val = &mat;

将使修改位变得容易

于 2013-05-08T12:17:09.547 回答