You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言多维数组处理及加速度计缓冲区函数传参问题

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:52:28