【问题标题】:Why does this index work? c++为什么这个索引有效? C++
【发布时间】:2014-06-27 17:14:08
【问题描述】:

所有,我的教授给了我们以下循环用于本周的作业:

char *ptr1, *ptr2;  
char c;
ptr1 = &arr[0];  
ptr2 = &arr[idx-1];

while(ptr1 < ptr2){
  c     = *ptr1;  
  *ptr1 = *ptr2;
  *ptr2 = c;

  ptr1++;
  ptr2--;
}  

这是关于 ptr1 与 ptr2 的位置吗?该程序反转 c_str 并且工作正常,我只是不明白为什么。

【问题讨论】:

  • 代码已修复。是因为它们指向同一个数组吗?
  • 由于两个指针现在是相关的,因此可以像您一样比较它们。
  • @JoachimPileborg,没关系。我错了;这是未指定的。现在因为那里有一个 C 标签,谁知道呢,因为它在 C 中是未定义的,在 C++ 中是未指定的。
  • 要了解代码的作用,请在调试器中逐行执行,检查所有变量的值。它应该告诉你它是如何工作的。
  • 它基本上是交换第一个和最后一个字母,然后是第二个与倒数第二个,然后是第三个......

标签: c++ while-loop


【解决方案1】:

您在理解个别陈述时有问题吗?如果没有,那么看看它是如何工作的只是一个步骤的问题。

循环的前三个语句交换ptr1 指向的字符和ptr2 指向的字符。最初,ptr1ptr2 指向字符串的第一个和最后一个字符。第二遍,它们指向字符串的第二个和倒数第二个字符等。

最初:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  a  |  b  |  c  |  d  |  e  | NUL |    c |  ?  |
        +-----+-----+-----+-----+-----+-----+      +-----+
           ^                       ^
           |                       |
          ptr1                    ptr2

c = *ptr1;之后:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  a  |  b  |  c  |  d  |  e  | NUL |    c |  a  |
        +-----+-----+-----+-----+-----+-----+      +-----+
           ^                       ^
           |                       |
          ptr1                    ptr2

*ptr1 = *ptr2;之后:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  e  |  b  |  c  |  d  |  e  | NUL |    c |  a  |
        +-----+-----+-----+-----+-----+-----+      +-----+
           ^                       ^
           |                       |
          ptr1                    ptr2

*ptr2 = c;之后:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  e  |  b  |  c  |  d  |  a  | NUL |    c |  a  |
        +-----+-----+-----+-----+-----+-----+      +-----+
           ^                       ^
           |                       |
          ptr1                    ptr2

ptr1++; ptr2--;之后:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  e  |  b  |  c  |  d  |  a  | NUL |    c |  a  |
        +-----+-----+-----+-----+-----+-----+      +-----+
                 ^           ^
                 |           |
                ptr1        ptr2

又过了一遍:

        +-----+-----+-----+-----+-----+-----+      +-----+
arr --> |  e  |  d  |  c  |  b  |  a  | NUL |    c |  b  |
        +-----+-----+-----+-----+-----+-----+      +-----+
                      ^ ^
                      | |
                   ptr1 ptr2

循环结束。

【讨论】:

    【解决方案2】:

    假设你有一个字符串。

    +---+---+---+---+---+---+---+---+---+---+---+
    | t | h | i | s |   | i | s |   | f | o | o |
    +---+---+---+---+---+---+---+---+---+---+---+
    

    现在让我们说ptr1ptr2 指向:

    ptr1                                    ptr2
    |                                       |
    v                                       v
    +---+---+---+---+---+---+---+---+---+---+---+
    | t | h | i | s |   | i | s |   | f | o | o |
    +---+---+---+---+---+---+---+---+---+---+---+
    

    while 循环的开始处。您现在可以按照 while 一次循环一步来理解为什么代码会反转 字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多