我已多次尝试找到这个问题的答案,但我认为我的搜索措辞很差,但我很难理解这个问题。离C太远了我猜。
我有一个编译时声明的2D缓冲区:
uint8_t buffers[NUM_BUFS][SIZE_BUF];
这个NUM_BUFS
大小应该等于SIZE_BUF
正确吗?我将其可视化为NUM_BUFS
行,SIZE_BUF
列。
现在我想做两件事:
以下是我的尝试:
从指针的角度来看:
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);
对于这样做的标准方法是什么,以及是否有一个具有数组括号可读性的方法,我将不胜感激。
答案 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);
}