2011-11-05 98 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)); 
    } 
}