我有一个固定大小的字节数组(大小始终相同)。以下是代码:
static void foo(uint8_t *arr_ptr);
void main()
{
uint8_t arr[4];
foo(&arr);
}
static void foo(uint8_t *arr_ptr)
{
for(uint8_t i=0; i<4; i++)
{
arr_ptr[i]=1; // Set to one just to make it simpler
}
}
这个想法是在主函数中有一个固定大小的数组作为缓冲区,并且每次调用foo时修改其内容。它按照预期工作,但会产生一些警告和信息,这让我认为某些地方可能没有正确声明。
在“static void foo(uint8_t *arr_ptr);”处:INFO: 预计的是“uint8_t*{aka unsigned char }”,但参数的类型是“uint8_t()[4]{aka unsigned char (*)[4]}”
在“foo(&arr)”处:WARNING: 从不兼容的指针类型传递参数 1
通过查阅其他帖子,我发现也许解决方法是将其声明为“(*arr)[4]”,这也许有意义,但实际应用时代码的工作方式不同。我相当确定我的思维混乱了,对于这些指针声明和参数传递的概念,如果有人能帮助我澄清,我会很感激。
foo(&arr);
-->foo(arr);
- David Ranieri&arr
是指向数组本身的指针,它的类型是uint8_t (*)[4]
。你想要传递一个指向第一个元素的指针,也就是&arr[0]
,或者直接使用arr
,因为它会转化为指向第一个元素的指针。该指针将具有预期的类型uint8_t *
。 - Some programmer dude