Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c+中的位置修改数组值+;_C++ - Fatal编程技术网

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]
,以与初始值设定项列表匹配