字符串和字符与printf的
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 *’
如果你试试这个:
#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]')。
数组的名字是其第一元素的地址,所以name
是一个指针,指向存储器包含字符串“希瓦”。
另外你不需要一个指针来显示一个字符;在这种情况下,您只是选择直接从数组中使用它。你可以这样做:
char c = *name;
printf("%c\n", c);
你混淆了反引用操作符*和指针类型注释*。 基本上,在C *中意思是不同的东西在不同的地方:
- 在一个类型中,*表示一个指针。 int是整数类型,int *是指向整数类型的指针
- 作为前缀运算符,*表示“取消引用”。名称是一个指针,*名称是取消引用它的结果(即获取指针指向的值)
- 当然,作为中缀运算符,*表示“乘法”。
'*'引用一个指针,总是意味着同样的事情。你只是在超越它(一个智力的标志)。像这样查看它,'int * myintptr;'意味着指针myintptr所引用的地址将存储一个int,而* myintptr = 5;意味着myintptr指针所指向的地址应该包含一个5.'*'总是指“at的值”。 –
%c
被设计用于单个字符一个字符,所以它仅打印一个element.Passing char数组作为要传递的阵列的第一个元素(即一个单个字符的地址的指针),然后将被打印:
小号
printf("%c\n",*name++);
将打印
我
等等......不需要为%S
指针,因为它可以与字符的字符串直接工作。
如果要显示单个字符,则还可以使用name[0]
而不是使用指针。
这将成为你的目的,但如果你想显示使用%c
满弦,你可以试试这个:
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}
更重要的一点'* name'是* derefencing *指针(即返回的东西指针指向) –