C 带printf的字符串和字符

C 带printf的字符串和字符,c,printf,C,Printf,我对在下面的c程序中使用%c和%s感到困惑 #include <stdio.h> void main() { char name[]="siva"; printf("%s\n",name); printf("%c\n",*name); } 为什么我们需要使用指针来显示字符%c,而字符串不需要指针 我使用时出错 printf("%c\n", name); 我犯的错误是

我对在下面的c程序中使用
%c
%s
感到困惑

#include <stdio.h>
    
void main()
{
    char name[]="siva";
    printf("%s\n",name);
    printf("%c\n",*name);
}
为什么我们需要使用指针来显示字符%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 *’

数组的名称是其第一个元素的地址,因此
name
是指向包含字符串“siva”的内存的指针

此外,不需要指针来显示字符;在本例中,您只是选择直接从阵列中使用它。您可以这样做:

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

您将解引用运算符*与指针类型注释*混淆。 基本上,C*表示不同地方的不同事物:

  • 在类型中,*表示指针。int是整数类型,int*是指向整数类型的指针
  • 作为前缀运算符,*表示“取消引用”。name是指针,*name是取消引用它的结果(即获取指针指向的值)
  • 当然,作为中缀运算符,*表示“乘法”
是为单个字符设计的字符,因此它只打印一个元素。将字符数组作为指针传递就是传递数组的第一个元素(即单个字符)的地址,然后将打印:

s

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

i

等等

%s不需要指针,因为它可以直接处理字符串。

如果您尝试此操作:

#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]);
}
#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
} 
所以“name”实际上是指向内存中字符数组的指针。如果尝试读取0xbff5391b处的前四个字节,将看到“s”、“i”、“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]或*name引用(因为对于数组名称=&name[0])


要打印字符串,需要将指向字符串的指针传递给printf(在本例中为“name”或“&name[0]”)。如果要显示单个字符,还可以使用
name[0]
而不是使用指针

它可以满足您的需要,但如果您想使用
%c
显示完整字符串,您可以尝试以下方法:

#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]);
}
#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
} 
#包括
void main()
{ 
字符名称[]=“湿婆”;
int i;

对于(i=0;i问题是printf函数需要一个指针作为参数。然而,char是一个可以直接访问的变量。字符串是字符串第一个字符上的指针,因此不必添加*因为*是变量指针的标识符。

更重要的是
*name
取消了指针的限制(即返回指针指向的对象)
*
对于指针来说,总是意味着同样的事情。你只是想得太多了(这是智能的标志)。这样看,
int*myintptr;
表示指针
myintptr
引用的地址将存储一个
int
,而
*myintptr=5;
表示指针
myintptr
引用的地址应包含一个5。
*
始终表示“处的值”。欢迎来到StackOverflow!这个问题已经有好几年了,有很多解释得很好的详细答案。目前,你的答案并没有比这些其他答案添加更多内容。如果你能够提供更多细节并为问题添加一些新方面,请编辑你的帖子并将其包括在内。如果你不能,请不要担心!这个网站上还有很多其他问题,请删除这个答案,然后尝试解决一些更新的问题。回答愉快!
#include<stdio.h>
void main()
{ 
    char name[]="siva";
    int i;
    for(i=0;i<4;i++)
    {
        printf("%c",*(name+i));
    }
}