指针char输出说明

时间:2015-10-25 14:30:22

标签: c pointers

   char alpha[] = "abcdefghi";
   char ch[80], *pch = &ch[0];
   strcpy(ch, alpha);
   putchar(*pch++);
   putchar((*pch)++);
   putchar(*++pch);
   putchar(++(*pch));
   printf("\n%s", ch);

为什么putchar功能打印' a' ' B' ' C'并且' d'分别? 为什么printf(" \ n%s",ch);打印acddefghi? 指尖的东西我真的很糟糕。

5 个答案:

答案 0 :(得分:1)

好的,我会尽可能地解释这一点 当你这样做:putchar(* pch ++)你说的是'打印pch指向的地址的字符,然后将pch增加到指向下一个地址'。基本上,在第一个putchar()之前,* pch =' a'并在* pch =' b'之后(因为pch指向ch [1])。

现在,在第二个putchar()中你所说的是:'在pch指向的地址中打印字符,然后在该地址中增加CHARACTER的值1'。所以,不要在第二个putchar()中做你所做的,你可以用这两行替换这一行:
putchar(*pch); // 'b' *pch += 1; // see, you increment the value(notice the *), not the pointer.

但是,因为正如我所说的那样,它会在第二个putchar()之后增加角色,它只会打印出来的是' b'。所以,只是为了清除,在第二个putchar()之后,ch [0] =' a'(我们没有更改此值中的任何内容) 并且ch [1] =' c'(我们将字符的值增加1并且' b' + 1 =' c')。其余的没有改变,所以ch [2] =' c',ch [3] =' d'等等..但是pch指向ch [1]
现在,在第三个putchar()中,你做第一个类似的事情,除了你先增加pch指向的地址然后打印这个地址的值。所以,你可以用这两行代替第三个putchar():

pch++; // increment the pointer by one, it now points to ch[2], which is 'c'(it remained unchanged) putchar(*pch); // 'c'

所以,在第三个putchar()之后,ch [0] =' a'(保持不变),ch [1] =' c'(在第二个putchar()中改变), ch [2] =' c'(保持不变)

最后,在最后一个putchar()中,你所做的与第二个相似,只是你在打印它之前增加了pch所指向的CHARACTER的值。 请记住,pch指向ch [2] 所以,你可以用这两行替换最后一个putchar():

*pch += 1; // 'c' + 1 = 'd' putchar(*pch); // 'd'

因此,在4个putchars之后,ch [0] =' a'(它保持不变),ch [1] =' c'(在第二个putchar()中更改),ch [2] =' d'(在第四个putchar()中改变)和ch [3] =' d'(它保持不变),其余的字符串仍然存在没有改变,我认为现在很明显为什么你得到了从printf()获得的结果。

答案 1 :(得分:0)

ch是一个字符数组。在C中,数组只是指向数组中第一个元素的指针。这使ch成为char(char *)的指针。当你传递一个字符进行打印时,putchar会打印一个字符。 * pch ++说'使用此地址处的字符'然后将地址递增以指向下一个字符。 printf打印整个字符串,因为格式说明符“\ n%s”告诉printf打印在地址ch中找到的字符数组(如果你愿意的话,是一个字符串)。我们从上面知道的是一个字符数组。希望这可以帮助。

答案 2 :(得分:0)

取消引用指针并返回值'a',然后指针递增1.

putchar(*pch++);

与上面的第一个解释相同。返回'b'。

putchar((*pch)++);

增加指针然后取消引用它,返回的值为'c'。

putchar(*++pch);

与上一个相同,返回'd'的值。

putchar(++(*pch));

指针递增/递减基于声明的变量的类型。

由于ch被声明为一个字符数组,printf会打印出该变量的全部内容。

strcpy(ch, alpha);

alpha的内容复制到数组ch,即“abcdefghi”

所有“数组”衰减成指向T类型的第一个元素的指针。 (它们不是真正的数组!

答案 3 :(得分:0)

*pch++打印当前指针值并递增指针

(*pch)++打印当前指针值,并递增该值

*++pch它增加指针和新指针的打印值

++(*pch)它递增当前指针的值,然后打印该新值

putchar(*pch++);     // It prints ch[0], print and  increments pointer
putchar((*pch)++);   // It prints ch[1], print and increment value;
putchar(*++pch);     // It prints ch[2], pointer increments and print
putchar(++(*pch));   // It prints ch[2]+1, increment value and print

答案 4 :(得分:0)

地址值表示地址位置
数据值表示该地址中的值

尝试以这种方式思考:
*之后的任何内容都是地址 例如:* x,这里x的值是地址 当你组合*和x即* x时,它代表该地址的值 每当你执行* p ++时,p的值(地址值)post会根据指针的数据类型递增。因此,它将指向下一个地址块。它不会增加数据的价值。

在C中,char指针指向第一个数组的地址并打印整个数组,直到收到空字符。

观看指针讲座。你会很清楚的。