2

我在程序中收到警告,它说:

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

这是我的程序:

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

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

我在这里阅读了一些相关的问题,并用谷歌搜索了很多。如果 'array' 是一个数组,而 'array' 本身是一个指向 char 的指针,则据说 '&array' 是一个指向字符数组的指针。根据它所说的,由于我使用的是 %c,我认为应该传递一个指向字符数组的指针。Idk,如果有人解释 %[width]c 的工作原理,我会非常感激。

我还验证了所有 '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 编译器。我在想的是,与函数指针一样,写 & 并不是强制性的。我读到,您不一定必须用函数指针编写 &。

我越来越糊涂了,求大神帮忙。

谢谢你。

4

2 回答 2

3

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

于 2013-10-18T04:28:57.470 回答
0

array 和 &array 是不一样的......即使它们在其中具有相同的地址位置。

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

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

scanf 函数需要数组.. 不是 &array

于 2013-10-18T04:32:01.593 回答