在2D数组中引用行的正确方法

时间:2014-08-01 00:39:11

标签: c

我已多次尝试找到这个问题的答案,但我认为我的搜索措辞很差,但我很难理解这个问题。离C太远了我猜。

我有一个编译时声明的2D缓冲区:

uint8_t buffers[NUM_BUFS][SIZE_BUF];

这个NUM_BUFS大小应该等于SIZE_BUF正确吗?我将其可视化为NUM_BUFS行,SIZE_BUF列。

现在我想做两件事:

  1. 获取对单行的引用以提供函数
  2. 从行引用中获取对行中单个元素的引用。
  3. 以下是我的尝试:

    从指针的角度来看:

    uint8_t* row = *(buffers + SIZE_BUF*rowIDX);
    
    uint8_t element = *(row + elementIDX);
    

    这编译很好并且有效,但很麻烦。

    从阵列访问的角度来看:

    uint8_t* row = &buffers[rowIDX];
    
    uint8_t element = row[elementIDX];
    

    在尝试将行传递给将访问其元素的函数时,这会给我一个编译器警告:passing argument 1 of 'someFunc' from incompatible pointer type [enabled by default]

    以及expected 'uint8_t *' but argument is of type 'uint8_t (*)[515]'

    的信息声明

    someFunc声明为:     void someFunc(uint8_t * row,uint16_t len);

    对于这样做的标准方法是什么,以及是否有一个具有数组括号可读性的方法,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

这应该有效:

void someFunc(uint8_t *ptr)
{
}

用这个:

uint8_t buffers[NUM_BUFS][SIZE_BUF];
uint8_t* row = buffers[rowIDX];
uint8_t element = row[elementIDX];
someFunc(row);

答案 1 :(得分:0)

对于行,您只需编写uint8_t * row = buffers[rowIDX];

即可

然后,您只需访问row中的元素,如下所示:row[colIDX]

请注意,这不适用于列,因为C使用2D数组的行主顺序: http://en.wikipedia.org/wiki/Row-major_order

对于列,您必须编写uint8_t * col= &buffers[0][colIDX];

然后您可以访问col中的元素,如下所示:col[rowIDX * SIZE_BUF]

例如:

#include "stdio.h"


#define NUM_BUFS 10
#define SIZE_BUF 20

uint8_t buffers[NUM_BUFS][SIZE_BUF];

void PrintRow(uint8_t * row) {
    for (uint8_t i=0; i<SIZE_BUF; ++i) printf("%lu\n", row[i]);
}

void PrintCol(uint8_t * col) {
    for (uint8_t i=0; i<NUM_BUFS; ++i) printf("%lu\n", col[i*SIZE_BUF]);
}

int main() {

    for (uint8_t i=0; i<NUM_BUFS; ++i) for (uint8_t j=0; j<SIZE_BUF; ++j) buffers[i][j] = i*j;

    uint8_t rowIDX = 3;

    printf("Row:\n");
    uint8_t * row = buffers[rowIDX];
    PrintRow(row);

    uint8_t colIDX = 3;
    printf("Col:\n");
    uint8_t * col = &buffers[0][colIDX];
    PrintCol(col);
}