不理解*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 ,实际取值和指针指向的位置是什么样的关系?
在这段代码中, *target++是一个表达式,它的计算顺序如下:
1. 首先, *target解引用指针target ,获取指针当前指向的字符。
2. 然后, target++执行指针的后置递增操作,将指针指向下一个字符。
所以,在这段代码中, *target++实际上是获取当前指针指向的字符,并将指针指向下一个字符。因此, *target++表达式在计算时,实际上是先取值,再递增指针。
对于这段代码中的循环,它的目的是计算输入字符串的长度。当指针target指向\0字符时,循环结束。所以,指针指向的最后一位是\0 。
关于为什么改成*++target就不需要减一,这是因为先递增指针再解引用,所以指针指向的位置是下一个字符,不包括当前字符。所以,使用*++target可以直接计算字符串的长度,不需要再减一。
希望这样的解释能够帮助你理解这段代码的运行逻辑。如果还有疑问,请随时提问。 在这段代码中,*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:} 我的意思*target++本来就少一位,为什么还要减一位? 运行下就好了 输入 aaa 结果为2 你想的没问题 本帖最后由 xiaotubie 于 2023-11-7 08:41 编辑
应该是你输入回车后导致多了一个'\n' 回车字符,所以如果你不减去 1的话,就不对了,譬如你输入abc回车后,那么如果不减1 将会输出4, 也就是回车键也算是一个你输入的字符。
*target++ 最开始取的是第一个字符,也就是从第一个字符开始比较,运算后target指向第二个字符,循环结束后,target指向的是'\0'后面那个字符
而*++target 最开始取的是第二个字符,也就是从第二个字符比较,运算后target也指向第二个字符,循环结束后,target指向的是'\0'
xiaotubie 发表于 2023-11-6 22:11
应该是你输入回车后导致多了一个'\n' 回车字符,所以如果你不减去 1的话,就不对了,譬如你输入abc回车后, ...
明白了,十分感谢!
页:
[1]