C编程:’&’与scanf中的数组

我的程序中有一个警告,它说:

format '%c' expects argument of type 'char *' , but argument 2 has type 'char (*)[10]' [-Wformat]

这是我的计划:

 #include int main() { char array[10]; scanf("%10c", &array); printf("%.10s", array); return 0; } 

当我从scanf中删除“&”时,警告消失。 我知道,这是一个数组,不需要&。 但他们有不同的效果吗? 我的意思是’&array’和’array’给出了它的第一个元素的地址,对吧? 如果是这样,这有什么区别?

我在这里阅读了一些相关的问题,并且搜索了很多。 有人说’&array’是一个指向字符数组的指针,如果’array’是一个数组,而’array’本身是一个指向char的指针。 根据它的说法,因为我正在使用%c,我认为应该传递一个指向字符数组的指针。 Idk,如果有人解释%[width] c的工作方式,我会很高兴。

我还validation了所有’array’,’&array’和’&array [0]’给出了它的第一个元素的地址。 这是我做的:

 int main() { char array[10]; puts("ADDRESS:"); printf(" %p \n %p \n %p", array, &array, &array[0]); return 0; } 

如果他们都给出相同的地址,为什么要给出这样的警告呢? 它也适用于%s。 它们在大多数Windows编译器中都能正常工作,没有任何警告。

由于我是Windows用户,我以前从未使用过gcc编译器。 而我的想法是,写入和函数指针并不是强制性的。 我读过你不一定要用函数指针写。

我越来越困惑,请帮我搞定。

谢谢。

array&array都产生指向同一地址的指针,但具有不同的类型。 前者在大多数情况下等同于&array[0] ,在你的情况下是char * 。 然而, &array是数组本身的地址,在您的示例中具有char (*)[10]类型。

数组和数组不一样……即使它们的地址位置相同。

这里的数组是char数组,它指向一个char,如果你增加它会增加1个字符大小。

但是&array指向整个数组,如果增量则增加数组大小。

scanf函数需要数组.. not&array