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? 指尖的东西我真的很糟糕。
答案 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指针指向第一个数组的地址并打印整个数组,直到收到空字符。
观看指针讲座。你会很清楚的。