2011-11-05 58 views
26

I的混合物在以下的C程序的%c使用和%s混淆字符串和字符與printf的

#include<stdio.h> 

    void main() 
    { 
    char name[]="siva"; 
    printf("%s\n",name); 
    printf("%c\n",*name); 
    } 

輸出是

siva 
s 

爲什麼我們需要使用指針來顯示字符%C ,並且指針不需要用於字符串

我在使用時出現錯誤

printf("%c\n", name); 

錯誤我得到是

str.c: In function ‘main’: 
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’ 

回答

42

如果你試試這個:

#include<stdio.h> 

void main() 
{ 
char name[]="siva"; 
printf("name = %p\n", name); 
printf("&name[0] = %p\n", &name[0]); 
printf("name printed as %%s is %s\n",name); 
printf("*name = %c\n",*name); 
printf("name[0] = %c\n", name[0]); 
} 

輸出是:

name = 0xbff5391b 
&name[0] = 0xbff5391b 
name printed as %s is siva 
*name = s 
name[0] = s 

所以 '名字' 實際上是一個指向字符在內存中的數組。如果你嘗試閱讀在0xbff5391b的前四個字節,你會看到的',「我」,「V」和「A」

Location  Data 
========= ====== 

0xbff5391b 0x73 's' ---> name[0] 
0xbff5391c 0x69 'i' ---> name[1] 
0xbff5391d 0x76 'v' ---> name[2] 
0xbff5391e 0x61 'a' ---> name[3] 
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string 

要打印您需要的字符的值傳遞給字符的printf。該值可以引用爲名稱[0]或*名稱(因爲對於數組名稱= &名稱[0])。

要打印一個字符串,您需要將一個指向字符串的指針傳遞給printf(在本例中爲'name'或'& name [0]')。

4

數組的名字是其第一元素的地址,所以name一個指針,指向存儲器包含字符串「希瓦」。

另外你不需要一個指針來顯示一個字符;在這種情況下,您只是選擇直接從數組中使用它。你可以這樣做:

char c = *name; 
printf("%c\n", c); 
+1

更重要的一點'* name'是* derefencing *指針(即返回的東西指針指向) –

6

你混淆了反引用操作符*和指針類型註釋*。 基本上,在C *中意思是不同的東西在不同的地方:

  • 在一個類型中,*表示一個指針。 int是整數類型,int *是指向整數類型的指針
  • 作爲前綴運算符,*表示「取消引用」。名稱是一個指針,*名稱是取消引用它的結果(即獲取指針指向的值)
  • 當然,作爲中綴運算符,*表示「乘法」。
+0

'*'引用一個指針,總是意味着同樣的事情。你只是在超越它(一個智力的標誌)。像這樣查看它,'int * myintptr;'意味着指針myintptr所引用的地址將存儲一個int,而* myintptr = 5;意味着myintptr指針所指向的地址應該包含一個5.'*'總是指「at的值」。 –

8
%c 

被設計用於單個字符一個字符,所以它僅打印一個element.Passing char數組作爲要傳遞的陣列的第一個元素(即一個單個字符的地址的指針),然後將被打印:

小號

printf("%c\n",*name++); 

將打印

等等......不需要爲%S

指針,因爲它可以與字符的字符串直接工作。

0

如果要顯示單個字符,則還可以使用name[0]而不是使用指針。

這將成爲你的目的,但如果你想顯示使用%c滿弦,你可以試試這個:

#include<stdio.h> 
void main() 
{ 
    char name[]="siva"; 
    int i; 
    for(i=0;i<4;i++) 
    { 
     printf("%c",*(name+i)); 
    } 
}