C语言多维数组处理及加速度计缓冲区函数传参问题
我正在开发加速度计板的C代码,用于填充轴数据缓冲区。现有两款不同的加速度计,分别提供X、Y、Z轴数据,共6组数据。我希望用3个2行32列的多维数组替代6个独立数组,但不清楚如何处理这类数组的函数传参:
当前函数声明如下:
bool run_detect_movement (int16_t *X_buffer, int16_t *Y_buffer, int16_t *Z_buffer)
void Read_FIFO_packet_16_IIM (int16_t *X_buffer, int16_t *Y_buffer, int16_t *Z_buffer)
void Read_FIFO_packet_8_LIS (int16_t *X_buffer, int16_t *Y_buffer, int16_t *Z_buffer)
简化的main.c代码:
int16_t x_buffer_arrays[2][32] = {0}; int16_t y_buffer_arrays[2][32] = {0}; int16_t z_buffer_arrays[2][32] = {0}; int main() { run_detect_movement (x_buffer_arrays, y_buffer_arrays, z_buffer_arrays); return 0; }
accelerometer.c代码:
bool run_detect_movement (int16_t *X_buffer, int16_t *Y_buffer, int16_t *Z_buffer) { /* Do some stuff here */ Read_FIFO_packet_16_IIM(X_buffer, Y_buffer, Z_buffer); Read_FIFO_packet_8_LIS(X_buffer, Y_buffer, Z_buffer); }
我需要在run_detect_movement函数中,将多维数组的第一行传给Read_FIFO_packet_16_IIM,第二行传给Read_FIFO_packet_8_LIS,请问是否可以传递多维数组的特定行作为指针?比如类似&(X_buffer[1][])的写法是否可行?另外,将多维数组传递给处理普通数组的函数时,能否正常填充缓冲区,还是会出现错误?
1. 多维数组特定行的正确传递方式
你提到的&(X_buffer[1][])写法不符合C语言语法,是错误的。正确传递多维数组某一行的方式有两种:
方式一:明确函数参数为二维数组类型
修改run_detect_movement的参数声明,指定二维数组的维度,这样可以直接通过数组名[行号]的方式获取该行的首指针,类型正好匹配int16_t*:bool run_detect_movement (int16_t X_buffer[2][32], int16_t Y_buffer[2][32], int16_t Z_buffer[2][32]) { // 传递第一行给IIM传感器函数 Read_FIFO_packet_16_IIM(X_buffer[0], Y_buffer[0], Z_buffer[0]); // 传递第二行给LIS传感器函数 Read_FIFO_packet_8_LIS(X_buffer[1], Y_buffer[1], Z_buffer[1]); return true; }这种写法可读性高,不需要手动计算内存偏移,是优先推荐的方式。
方式二:通过指针偏移定位行地址
若不想修改函数参数类型,可利用指针偏移计算第二行的起始地址(每行固定32个元素):bool run_detect_movement (int16_t *X_buffer, int16_t *Y_buffer, int16_t *Z_buffer) { // 第一行起始地址就是传入的指针本身 Read_FIFO_packet_16_IIM(X_buffer, Y_buffer, Z_buffer); // 第二行起始地址 = 首指针 + 每行元素数 Read_FIFO_packet_8_LIS(X_buffer + 32, Y_buffer + 32, Z_buffer + 32); return true; }这种方式需要明确每行的元素数量,可读性略差,但不需要修改函数签名。
2. 多维数组行与普通一维数组的兼容性
只要传递的是多维数组某一行的首指针(类型为int16_t*),就和传递普通一维数组完全等价,函数可以正常填充缓冲区,不会出现错误。因为C语言中,一维数组名和指向数组首元素的指针在函数参数场景下是兼容的,函数内部处理的是连续的内存块,不管这块内存来自一维数组还是二维数组的某一行。
3. main函数传参的兼容性
如果采用第一种方式修改run_detect_movement的参数为二维数组,main函数中的原有调用不需要修改——二维数组名x_buffer_arrays会自动转换为指向第一行的指针,和函数参数的int16_t[2][32]类型兼容。
内容的提问来源于stack exchange,提问作者Dominykas

