鱼C论坛

 找回密码
 立即注册
查看: 1423|回复: 6

[已解决]不理解*target++

[复制链接]
发表于 2023-11-6 19:17:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

#define MAX 1024

int main()
{
        char str[MAX];
        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 ,实际取值和指针指向的位置是什么样的关系?
最佳答案
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'

不理解第一位和最后一位怎么表示

不理解第一位和最后一位怎么表示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-6 19:17:42 | 显示全部楼层
在这段代码中, *target++  是一个表达式,它的计算顺序如下:

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

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

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

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

希望这样的解释能够帮助你理解这段代码的运行逻辑。如果还有疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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是先移动指针后取值。对于字符串的长度计算,需要根据具体的操作顺序进行适当的调整。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-6 19:21:35 | 显示全部楼层
我的意思*target++本来就少一位,为什么还要减一位?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-6 20:00:45 | 显示全部楼层
运行下就好了 输入 aaa 结果为2 你想的没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-7 09:37:39 | 显示全部楼层
xiaotubie 发表于 2023-11-6 22:11
应该是你输入回车后导致多了一个'\n' 回车字符,所以如果你不减去 1的话,就不对了,譬如你输入abc回车后, ...

明白了,十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表