【问题标题】:how does this while loop sort out pointers?这个while循环如何整理指针?
【发布时间】:2021-11-24 11:16:23
【问题描述】:

我是指针的新手,大约一周前发现了它们。我正在阅读的这本书向我介绍了一个需要我解决的问题,我花了一段时间才想出正确的解决方案,所以我作弊了。查了一下,想出了这个:

#include <iostream>

void mystrcpy(char* str1, char* str2) {
    while (*str1++ = *str2++);

}

int main() {
    char str1[15] = "C++";
    char str2[15] = "Pointers";

    std::cout << str1 << std::endl << str2 << std::endl;

    mystrcpy(str1, str2);

    std::cout << str1 << std::endl << str2 << std::endl;
}

问题是我在 void 函数处填写空白以解决问题以及在 main() 打印出以下问题:

C++
Pointers
C++
Pointers

它想让我看起来像这样:

C++
Pointers
Pointers
Pointers

所以,基本上我不明白while (*str1++ = *str2++); 是如何解决这个问题的?看了一段时间还是不知道它是如何将字符串排序出来输出的

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    指针就像变量,指向到内存中的特定位置。您可以取消引用它们以获取它们使用*str2 指向的值,并递增它们以使它们指向内存中的下一个值(基于它们的数据类型) :str2++.

    优先级可能会令人困惑。 *str2++ 按此顺序工作:

    • 获取str2指向的值,然后
    • 增加str2 以指向下一个字符
        while (*str1++ = *str2++);
    

    此语句将每个字符从str2 复制到str1,直到它到达str2 中的空指针。它的工作原理:

    • *str2:获取str2指向的字符
    • *str1 = *str2:将str2指向的字符写入str1指向的目的地
    • str1++str2++:为下一次循环迭代增加 str1str2。现在每个指针都指向每个字符串中的下一个字符。
    • str2指向空终止符时,*str2返回0(或'\0'),*str1 = *str2将其写入str1,并返回0,这将导致while循环完成。

    【讨论】:

    • 有用的信息。谢谢,但我仍然不完全明白发生了什么。必须更深入地了解这一点
    【解决方案2】:

    每次迭代,循环将数组的第二个元素的值赋给数组的第一个元素,然后检查左边的集合值是否等于0,如果不等于,则循环继续。在迭代结束时,循环增加两个变量。

    【讨论】:

      【解决方案3】:

      str1C++ 开头,str2 Pointers 开头。然后调用mystrcopy 函数将str2 的值复制到str1

      复制是由相关行完成的:

      while (*str1++ = *str2++);
      

      我同意这条线相对不透明,但这里有一些基础知识:

      • 每个“取消引用”上的* 指向每个指针。这意味着它正在查看存储在给定地址的值,而不是地址本身。
      • ++ 用于将指针地址从其当前位置移动到数组中的下一个位置。它被放置在 指针之后,以便指针在 我们获取/设置它的值之后递增。
      • 这里的while循环只有一个条件,但条件本身就是一个动作。执行该操作并检查结果。当到达字符串的末尾时,会找到终止循环的 \0 字符。

      因此,总而言之,该行将单个 char 值从 str2 复制到 str1 的值中,递增两个指针以指向每个指针的下一个 char,然后重复直到失败。

      值得注意的是,虽然函数内部的指针被改变为指向新的地址,而不仅仅是每个数组的开头,这些指针变量并没有通过引用传递给函数,所以外部的指针变量该函数保持不变,仍然包含第一个字符的地址。但是,这些地址存储的数据已被修改。

      【讨论】:

      • 感谢这有很大帮助。即使失败,指针仍然可以递增吗?如果调用空变量,这不会导致系统崩溃吗?
      • 我想我对“失败”这个词的使用可能会产生误导。我的意思是“直到 while 条件计算为终止循环的值”。当到达\0 字符时,循环终止
      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 2022-12-13
      • 2021-02-18
      • 2016-03-11
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多