2013-10-18 57 views
2

阵列我在我的节目一个警告,它说:C编程: '和' 用在scanf

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中删除'&'时警告消失。 我知道,这是一个数组,不需要&。但是,它们不一样吗? 我的意思是'&数组'和'数组'给它的第一个元素的地址,对吧? 如果是这样,这里有什么区别?

我在这里阅读了一些相关的问题,并且搜索了很多。 有人说'&数组'是一个指向字符数组的指针,如果'数组'是一个数组而'数组'本身是一个指向字符的指针。 根据它所说的,因为我使用%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编译器。我在想的是,只要不是像函数指针那样编写&。 你不一定要写&与函数指针,我读。

我越来越困惑,请帮我弄明白。

谢谢。

+0

@ruakh 感谢编辑。 – 1lastBr3ath

回答

3

array&array都产生一个指向相同地址但指向不同类型的指针。前者在大多数情况下相当于&array[0],您的情况为char *。但是,&array是阵列本身的地址,在您的示例中其类型为char (*)[10]

+0

char(*)[10]是不是含有10个元素的指针数组? 感谢您的回答,但可能这不是我要找的。 – 1lastBr3ath

+0

不,'char(*)[10]'是一个指向10个char的数组的指针。 –

+0

好的。谢谢。 – 1lastBr3ath

0

数组和&数组是不一样的...即使他们有相同的地址位置。

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

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

scanf函数预计为阵列..不&阵列