c中指针为%s的字符数组
我有这两个c编程代码。除了一个步骤外,它们是相同的,因此它们的输出完全不同。请帮助我为什么会发生这种情况c中指针为%s的字符数组,c,arrays,string,pointers,null-character,C,Arrays,String,Pointers,Null Character,我有这两个c编程代码。除了一个步骤外,它们是相同的,因此它们的输出完全不同。请帮助我为什么会发生这种情况 main() { char ch[10]="123456"; char *p; int a; scanf("%d",&a); p=ch+a; *p='0'; printf("%s",ch); } output is nik@debian:~$ ./a.out 4 123406 这是另一个在第[*p='0'行只有轻微变化的 main() { char ch[10]="1234
main()
{
char ch[10]="123456";
char *p;
int a;
scanf("%d",&a);
p=ch+a;
*p='0';
printf("%s",ch);
}
output is
nik@debian:~$ ./a.out
4
123406
这是另一个在第[*p='0'行只有轻微变化的
main()
{
char ch[10]="123456";
char *p;
int a;
scanf("%d",&a);
p=ch+a;
*p=0; //only change is here rest is same
printf("%s",ch);
}
and output is
nik@debian:~$ ./a.out
4
1234
请给我解释为什么它是不同的,这是因为我在Prtff中使用%s,或者因为我已经丢失的其他东西 为了便于解释,让我们考虑我们坚持到底。< /P>
在第一种情况下
*p='0';
将'0'
(十进制48
)的ASCII值放入p
指向的内存中
在第二种情况下
*p = 0;
将ASCII值0
(十进制0
)本身放入p
指向的内存中
因此,在第一种情况下,对于作为%s
参数提供的字符串,给定索引(4)处的值为48
,这使得它打印文本0并继续,直到找到空终止符
现在,在第二种情况下,由于ASCII
0
指示给定索引处的空字符,%s
找到字符串的结尾并在那里停止。在第一段代码中,您将字符指针p分配给int值,然后取消引用指针并将其分配给另一个整数。解引用运算符将新值(包含0“0”的字符串)分配给以前由ch+a占用的内存地址
在第二段代码中,指针处的内存地址分配给整数值0,而不是字符串“0”
'0'
!=<代码>0。注:p=ch+a如果输入的数字使指针指向数组外部,则code>可能会调用UB。让我们想象一下,我们输入值<数组中元素的数量一段时间以来,在低级别编码中没有细微的变化。因为,每一点都很重要,它可以表示“是”或“否”。