C++ 使用c+中的位置修改数组值+;
假设我有一个C++ 使用c+中的位置修改数组值+;,c++,C++,假设我有一个unsigned int*val和unsigned char mat[24][8]。现在val存储变量mat的位置。是否可以使用val中的位置修改mat变量中的位 例如: val=0x00000001并且val在内存中的位置是0x20004000 mat的第一个元素位于0x00000001 现在我想修改matat的值,比如10,4。是否可以使用C++? 是的,可以使用地址(你所称的位置)来改变矩阵的值,但是必须从开始计算正确的偏移量。偏移计算应如下所示: (matrix_x_len
unsigned int*val
和unsigned char mat[24][8]
。现在val
存储变量mat
的位置。是否可以使用val
中的位置修改mat变量中的位
例如:
val=0x00000001
并且val
在内存中的位置是0x20004000
mat
的第一个元素位于0x00000001
现在我想修改
mat
at的值,比如10,4。是否可以使用C++? 是的,可以使用地址(你所称的位置)来改变矩阵的值,但是必须从开始计算正确的偏移量。偏移计算应如下所示:
(matrix_x_len * Y + X) * sizeof(unsigned int) + offset to the beggining of the matrix
然后,当您有偏移量时,您可以这样更改mat:
*(val+offset)=新的_值
是的,这是可能的,除非数组成员或指针目标是常量
例如:
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 } };
您当然可以修改这些位,因为
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元素在内存中的偏移量来编辑mat元素。
例如,访问val[10*8+4]
将从内存块的开头访问字节336,该内存块只有192个字节
您必须正确计算索引:
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个字节,这是引用的无符号int值的字节数sub_byte
如果您有相同的类型,除了需要计算正确的偏移量外,没有问题
#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
可以这样做,但将val设置为未签名字符* val=&mat
将对比特
进行简单的修改,如果你的问题是C++,为什么C标签?@ GARTHthTeGek Huh,你在说什么?@ CrasMistr对不起,删除了。我想你需要读数组。如果不同类型的VALL(未签名的INT*)和MAT(无符号CHAR[]])是插入的,请注意大多数答案忽略了这一点。@AbhishekThakur它在内存中是连续的。矩阵以192字节的连续序列存储,从位置mat
开始。OP使用的是无符号字符[][]@GaretheGeek我没有写他不是!OP使用的是一个2d字符数组和一个无符号的int ptr。@H2C03您的示例非常好,只是您必须将int arr[2][3]
更改为int arr[3][2]
,以与初始值设定项列表匹配