[英]Convert two dimensional array to a one dimension by using pointer in C language
[英]Attempting to convert a 2 dimensional array to single dimension in embedded C
由于发现用C操作2维数组非常困难,因此我决定尝试编写一个函数,该函数将2D数组转换为1D数组。 对于下面的2D数组,我希望将其转换为类似1D_array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
。
我在堆栈交换中遇到了一个非常类似的问题,链接在下面,并使用了建议的代码。
我使用的代码是:
#define KP_ROWS 4
#define KP_COLS 4
static Uint16 KP_TEST_Keys[KP_ROWS][KP_COLS] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 }
};
void main()
{
Uint16 array1D[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
memcpy(array1D, KP_TEST_Keys, sizeof(Uint16) * KP_ROWS * KP_COLS);
}
同样,我的总体目标是将2D数组转换为1D数组。
编辑:清除错误后,我才编辑并刚刚测试了上面的代码,它可以正常工作! array1D
包含我想要的格式的数据。
我是否正确使用memcpy?
可以,但是容易出错,因为array1D
的大小KP_TEST_Keys
与KP_TEST_Keys
的大小KP_TEST_Keys
。
Uint16 array1D[KP_ROWS*KP_COLS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;
// Recommend size of destination, not size of source
// Ideally, it would be the minimum of the size of source and destination.
memcpy(array1D, KP_TEST_Keys, sizeof array1D);
正如@Kurokawa Masato所说,必须在函数中使用memcpy()
。
建议使用uint16_t
类的标准类型,而不是Uint16
。
2D阵列数据已经按照您1D阵列所需的顺序连续存储。 完全不需要在单独的数组中复制数据; 您只需要按如下方式转换2D数组:
Uint16* array1D = (Uint16*)KP_TEST_Keys ;
这提供了2D阵列的1D阵列视图 ,而无需复制数据。 对1D视图的更改直接更改了2D数据,因此无需在两个表示之间进行复制。
如果一维数组视图为只读,则可以通过以下方式强制执行此操作:
const Uint16* array1D = (const Uint16*)KP_TEST_Keys ;
此外,如果将1D阵列锁定到2D阵列并且不能够重新分配给其他阵列,则:
Uint16* const array1D = (Uint16* const)KP_TEST_Keys ;
或两者结合使用(指向常量数据的常量指针):
const Uint16* const array1D = (const Uint16* const)KP_TEST_Keys ;
这里的一个重要区别是sizeof(array1D)
是指针的大小,而不是数组的大小。 您应该同时使用sizeof(KP_TEST_Keys)
。
如果在KP_TEST_Keys
声明之后在文件作用域进行了这些声明,则一维视图将以与2D相同的生存期和作用域存在:
static Uint16 KP_TEST_Keys[KP_ROWS][KP_COLS] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 }
};
static Uint16* array1D = (Uint16*)KP_TEST_Keys ;
您还可以在使用时直接执行强制转换,而不用引入新变量来访问各个元素,例如:
Uint16 element = ((Uint16*)KP_TEST_Keys)[i] ;
其中i
是sizeof(KP_TEST_Keys) - 1
引0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.