我有一个包含字节的固定大小的数组(大小将始终相同)。这是代码:
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
}
}
这个想法是在main上有一个固定大小的数组作为缓冲区,并在每次调用foo时修改其内容。它可以正常工作,但是它给出了一些警告和信息,使我认为某些内容未正确说明。
在
static void foo(uint8_t *arr_ptr);
:信息:预期的'uint8_t * {aka unsigned char }”,但参数的类型为“ uint8_t()[4] {aka unsigned char(*)[4]}'在
foo(&arr)
:警告:从不兼容的指针类型传递'foo'的参数1
深入研究其他一些文章,我发现也许一个解决方案是将其声明为(*arr)[4]
,这也许是有道理的,但是应用它们会使代码的工作方式有所不同。我很确定我对这个指针声明和参数传递感到困惑,因此,如果有人可以帮助我阐明这些概念,我将不胜感激。
答案 0 :(得分:2)
警告是因为传递的指针具有另一种类型。
数组衰减到指针:
int arr[10];
foo(arr); /* <- array decals to the pointer to int. */
foo(&arr); /* <- array decals to the pointer to array of 10 ints. */
两个指针都引用内存中的同一对象,但是具有不同的类型-因此发出警告。