c - 指针char输出说明

标签 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? 我对指针的东西真的很糟糕。

最佳答案

好的,我会尽可能简单地解释这一点。
当您执行以下操作时: putchar(*pch++) 您所说的是“打印 pch 指向的地址的字符,然后递增 pch 以指向下一个地址”。本质上,在第一个 putchar() 之前,*pch = 'a' 和 *pch = 'b' 之后(因为 pch 现在指向 ch[1])。

现在,在第二个 putchar() 中,您所说的是:“打印 pch 指向的地址中的字符,然后将该地址中的字符值增加 1”。因此,您可以用以下两行替换这一行,而不是执行第二个 putchar() 中所做的操作:
putchar(*pch);//'b' *pch += 1;//看,您增加了值(注意 *),而不是指针。

然而,因为正如我所说,它在第二个 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++;//将指针加一,它现在指向 ch[2],即 'c'(保持不变) 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 个 putchar 之后,ch[0] = 'a'(保持不变),ch[1] = 'c'(在第二次 putchar() 中更改),ch[2] = 'd' (在第四个 putchar() 中更改)和 ch[3] = 'd'(保持不变),字符串的其余部分保持不变,我认为现在很明显为什么你会得到从 printf() 得到的结果.

关于c - 指针char输出说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330823/

相关文章:

使用指针更改结构内的数据

c - 提示编写可重入求和函数

c - 如何将多维 C 数组传递给函数?

c - C 语言的 Prime Finder

c - 定位Vala/Sqlite3内存泄漏

c - 二进制搜索函数完成而不返回 int

mysql - 如何释放: MYSQL_ROW row;?

c++ - 如何从指向 C++ 中 vector 的指针访问 vector 的内容?

c++ - 如何将对象作为参数传递给类

C: 字符串 "eating"循环(可能)