【发布时间】:2019-05-20 08:56:24
【问题描述】:
我有一个包含字节的固定大小的数组(总是相同的大小)。代码如下:
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);: INFO: 预期 'uint8_t*{aka unsigned char }' 但参数的类型为 'uint8_t()[4]{aka unsigned 字符 (*)[4]}'
foo(&arr):警告:从不兼容的指针类型传递 'foo' 的参数 1
在其他一些帖子中挖掘了一下,我发现也许解决方案是将其声明为(*arr)[4],这可能是有道理的,但应用它们会使代码工作不同。我很确定我对这个指针声明和参数传递感到一团糟,所以如果有人能帮助我澄清这些概念,我将不胜感激。
【问题讨论】:
-
不要传递数组的地址,当传递给函数时,数组已经(衰减成)指针:
foo(&arr);-->foo(arr); -
&arr是指向数组本身的指针,它的类型为uint8_t (*)[4]。你想传递一个指向第一个元素的指针,即&arr[0],或者简单的arr,因为它会衰减到指向第一个元素的指针。该指针将具有uint8_t *的预期类型。 -
谢谢@KeineLust 和@some-programmer-dude,修复了警告。无论如何,这意味着将数组按原样传递给函数将始终将其作为指针传递?所以修改它也会在main中修改它......
-
@user11527039 是的!
-
您当前的函数已经正在修改数组的内容。还是你的意思是别的?