为啥这个索引有效? 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
指向的字符。最初,ptr1
和ptr2
指向字符串的第一个和最后一个字符。第二遍,它们指向字符串的第二个和倒数第二个字符等。
最初:
+-----+-----+-----+-----+-----+-----+ +-----+
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 |
+---+---+---+---+---+---+---+---+---+---+---+
现在让我们说ptr1
和ptr2
指向:
ptr1 ptr2
| |
v v
+---+---+---+---+---+---+---+---+---+---+---+
| t | h | i | s | | i | s | | f | o | o |
+---+---+---+---+---+---+---+---+---+---+---+
在while
循环的开始处。您现在可以按照
while
一次循环一步来理解为什么代码会反转
字符串。
【讨论】:
以上是关于为啥这个索引有效? C++的主要内容,如果未能解决你的问题,请参考以下文章
为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]