妖娆乌龙茶 发表于 2023-11-6 19:17:28

不理解*target++

#include <stdio.h>

#define MAX 1024

int main()
{
      char str;
      char *target = str;
      int length = 0;

      printf("请输入一个字符串:");
      fgets(str, MAX, stdin);

      while (*target++ != '\0')
      {
                length++;
      }

      printf("您总共输入了 %d 个字符!\n", length - 1);

      return 0;
}

不理解S1E22课后练习动动手里这个*target++

按答案里的说法,实际取值比指针指向结果少一位,那第一位的字符指针有指到吗?指针指向的最后一位是\n还是\0? 计算顺序是什么样的,
为什么改成*++target就不用减一即减去\n ,实际取值和指针指向的位置是什么样的关系?

isdkz 发表于 2023-11-6 19:17:42

在这段代码中, *target++是一个表达式,它的计算顺序如下:

1. 首先, *target解引用指针target ,获取指针当前指向的字符。
2. 然后, target++执行指针的后置递增操作,将指针指向下一个字符。

所以,在这段代码中, *target++实际上是获取当前指针指向的字符,并将指针指向下一个字符。因此, *target++表达式在计算时,实际上是先取值,再递增指针。

对于这段代码中的循环,它的目的是计算输入字符串的长度。当指针target指向\0字符时,循环结束。所以,指针指向的最后一位是\0 。

关于为什么改成*++target就不需要减一,这是因为先递增指针再解引用,所以指针指向的位置是下一个字符,不包括当前字符。所以,使用*++target可以直接计算字符串的长度,不需要再减一。

希望这样的解释能够帮助你理解这段代码的运行逻辑。如果还有疑问,请随时提问。

Mike_python小 发表于 2023-11-6 19:19:08

在这段代码中,*target++是一个复合操作,它实际上是对指针target进行两个操作:首先取出指针所指向的值,然后将指针向后移动一位。

具体来说,*target++可以拆解为以下两个步骤:
1. *target:取出指针target所指向的字符。
2. target++:将指针target向后移动一位,指向下一个字符。

在循环中,使用*target++ != '\0'作为判断条件,表示当指针指向的字符不是字符串结束符\0时,执行循环体。因此,循环会一直进行,直到指针指向字符串的结束符为止。

计算字符长度的方式是通过记录循环次数来实现的,每次循环代表一个字符的读取。由于最后一个字符是字符串的结束符\0,因此循环的次数减去1才是字符串的实际长度。

如果将代码改为*++target,则操作顺序会有所变化。++target会先将指针向后移动一位,然后*++target会取出指针所指向的下一个字符。这样就不再需要减去1来得到字符串的实际长度,因为循环中不再包括最后的结束符\0。

总结一下,*target++是先取值后移动指针,而*++target是先移动指针后取值。对于字符串的长度计算,需要根据具体的操作顺序进行适当的调整。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

妖娆乌龙茶 发表于 2023-11-6 19:21:35

我的意思*target++本来就少一位,为什么还要减一位?

huazhinailuo 发表于 2023-11-6 20:00:45

运行下就好了 输入 aaa 结果为2 你想的没问题

xiaotubie 发表于 2023-11-6 22:11:46

本帖最后由 xiaotubie 于 2023-11-7 08:41 编辑

应该是你输入回车后导致多了一个'\n' 回车字符,所以如果你不减去 1的话,就不对了,譬如你输入abc回车后,那么如果不减1 将会输出4, 也就是回车键也算是一个你输入的字符。
*target++ 最开始取的是第一个字符,也就是从第一个字符开始比较,运算后target指向第二个字符,循环结束后,target指向的是'\0'后面那个字符
而*++target 最开始取的是第二个字符,也就是从第二个字符比较,运算后target也指向第二个字符,循环结束后,target指向的是'\0'

妖娆乌龙茶 发表于 2023-11-7 09:37:39

xiaotubie 发表于 2023-11-6 22:11
应该是你输入回车后导致多了一个'\n' 回车字符,所以如果你不减去 1的话,就不对了,譬如你输入abc回车后, ...

明白了,十分感谢!
页: [1]
查看完整版本: 不理解*target++