【发布时间】:2021-08-13 14:24:41
【问题描述】:
我以为我理解 c 和指针,但只是在调试别人的代码,我认为我认为不应该工作,但确实做到了。 作为一个(粗略的)例子......
void clear_buffer(char* buff, int len)
{
while(len)
{
*buff++ = ' ';
len--;
}
}
main()
{
char buffer[10];
clear_buffer(&buffer,10); // 1. what I found, it still works...
clear_buffer(buffer,10); // 2. what I would have wrote
}
让我吃惊的是,上面两个调用的工作方式完全相同。第一个给出编译器警告(不兼容的指针类型),但它仍然可以正确构建和运行。 所以我的问题是:这是 C 中的预期行为,还是只是我使用的编译器很聪明并修复了错误? fwiw,这是使用 microchip xc16 编译器。
【问题讨论】:
-
buffer是 char 数组类型。当您将数组传递给采用指针的函数时,数组会隐式衰减。它是有效的,但我宁愿通过&buffer[0]代替。 -
澄清重复:一旦
clear_buffer函数接收到地址,它将被解释为char*无论参数类型是什么。由于数组的地址与其第一个元素的地址相同,因此您的程序可以工作。 -
"但它仍然可以正确构建和运行" 请参阅What must a C compiler do when it finds an error?
标签: arrays c pointers implicit-conversion addressof