1613551 发表于 2022-5-4 16:10:40

从指针开始已经看不懂小甲鱼的程序了

第24行的减2到底减了啥啊,是地址向前移动了两位吗?
然后第27行的while ((*target1++ = *target2++) != '\0')是什么意思?比如我第一行输入了whose,第二行输入了is,那么第一行指针是从0到6,也就是w/h/o/s/e/回车/\0停下来后,这时候指针所指向的地址就是\0这个地址,然后这前面24行的减2,就是指向原本e这个位置?然后*target2一开始是指向i,然后又赋值给了target1,那不是把e给覆盖成i了嘛?
#include <stdio.h>

#define MAX 1024

int main()
{
      char str1; // 确保连接后不越界
      char str2;

      char *target1 = str1;
      char *target2 = str2;

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

      printf("请输入第二格字符串:");
      fgets(str2, MAX, stdin);

      // 将指针指向 str1 的末尾处
      while (*target1++ != '\0')
                ;

      // 我们希望 str1 最后边的 '\0' 和 '\n' 都被覆盖掉
      target1 -= 2;

      // 连接字符串
      while ((*target1++ = *target2++) != '\0')
                ;

      printf("连接后的结果是:%s", str1);

      return 0;
}

1613551 发表于 2022-5-4 16:12:15

好像有点理解指针的妙用了

风车呼呼呼 发表于 2022-5-4 16:29:46

while (*target1++ != '\0')
停在\0后面,不是在\0

1613551 发表于 2022-5-4 16:34:25

风车呼呼呼 发表于 2022-5-4 16:29
停在\0后面,不是在\0

是因为用的++,到了\0,虽然退出循环了,最后还是会+1吗

风车呼呼呼 发表于 2022-5-4 16:47:00

1613551 发表于 2022-5-4 16:34
是因为用的++,到了\0,虽然退出循环了,最后还是会+1吗

取值和自增在一个表达式,是一个整体。
表达式 *target1++运算出来就是返回了target1的值并后移操作
跟后面与'\0'比较没有关系,外面再怎么对这表达式的值进行操作都没关系。能得到表达式的值本身就说明它里面该操作的都操作完了

你想的那种应该写成
target1 != '\0' ? target++ : 0

1613551 发表于 2022-5-4 16:50:03

风车呼呼呼 发表于 2022-5-4 16:47
取值和自增在一个表达式,是一个整体。
表达式 *target1++运算出来就是返回了target1的值并后移操作
跟 ...

懂了
页: [1]
查看完整版本: 从指针开始已经看不懂小甲鱼的程序了