为啥这个索引有效? C++

Posted

技术标签:

【中文标题】为啥这个索引有效? C++【英文标题】: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++ 中是未指定的。 要了解代码的作用,请在调试器中逐行执行,检查所有变量的值。它应该告诉你它是如何工作的。 它基本上是交换第一个和最后一个字母,然后是第二个与倒数第二个,然后是第三个...... 【参考方案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 一次循环一步来理解为什么代码会反转 字符串。

【讨论】:

以上是关于为啥这个索引有效? C++的主要内容,如果未能解决你的问题,请参考以下文章

为啥具有负索引的数组有效? [复制]

为啥索引超出范围的子字符串切片有效?

为啥这是 C++ 中的有效函数声明? [复制]

为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]

尽管代码相同,但切换菜单按钮在索引页面上有效,但在其他页面上无效 - 为啥?

为啥定义没有 CUDA __device__ 属性的类头有效? (C++)