2013-10-18 55 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函數預計爲陣列..不&陣列