C ++:C字符串,指针和一个非常有趣的while循环

时间:2014-02-27 05:16:12

标签: c++ arrays pointers cstring

我看到一个C ++程序员职位的潜在求职面试可能会问你这个问题: 解释以下C ++代码段的作用。

char *aryA = "Data Structures";
char *aryB, *aryC;
aryB = new char[20];
aryC = aryB;
while (*aryB++ = *aryA++);

cout << aryC << endl;

我已经看了一段时间,但我不认为我理解了while循环。所以对我来说,只要两个指针相等,while循环就会说cout aryC。但是,两个指针都增加了一个,我用它来表示正在查看数组中的哪个char值。但如果它们是相同的并且两者都增加了一个,它们不会总是相等吗?还有另外一件事。字符aryB数组的值未定义;我们只知道数组中有20个值。那么你怎么能首先比较aryA和aryC呢?

如果有人可以花时间向我解释这段代码,我会非常感激。我在运行visual studio时遇到问题,所以我不能自己运行它,但即使我能想到我仍然可以从教我的人那里受益。

4 个答案:

答案 0 :(得分:2)

这很容易,*aryB++ = *aryA++可以被视为

*aryB = *aryA;
aryB++;
aryA++;

只是将aryA指向的字符分配给aryB,然后递增两者(移动到下一个字符。执行while,直到找到NUL终止字符,这是=运算符(不是==)返回指定值的事实表明了这一点。

在while之前将aryB保存到aryC只是一种将指针保持在复制字符串开头的方法,因为你丢失它然后递增aryB

答案 1 :(得分:0)

aryB = new char[20];将aryB设置为新的字符数组。

aryC = arB;将aryC设置为对aryB的引用。

while (*aryB++ = *aryA++);这个更复杂。它将aryB的当前值设置为aryA的当前值,而aryA的当前值不为false(0),然后移动两个指针前进一个(记住所有c个字符串以\ 0结束,其值为0) 。这也改变了aryC的值,但不是它指向的值。最后,aryA被复制到aryC。

答案 2 :(得分:0)

aryB是一个指向内存中地址的指针。通过将*放在指针(* aryB)前面,可以访问该内存地址的实际数据。 ++将指针递增1,这使它指向下一个内存地址。在while()中你不进行比较(运算符不是==),使用赋值运算符(=)。这意味着您将数据从内存aryA复制到aryB。另外aryC = aryB意味着aryC指向与aryB相同的内存地址(指向数组的第一个元素)。换句话说,通过修改aryB上的数据,您还可以为aryC修改它。

答案 3 :(得分:0)

char *aryA = "Data Structures";
char *aryB, *aryC;
aryB = new char[20];
aryC = aryB;

我们可以像这样可视化内存使用和指针内容:

[(char*)aryA]--------------------------v
                                     ["Data Structures\0"]

[(char*)aryB]-------------v
                         [ 20 uninitialised chars ]
                          ^
                          |
[(char*)argC]-------------/

然后:

while (*aryB++ = *aryA++);

像这样处理:

*aryB = *aryA    - assigns *aryB (the first uninitialised char),
                   with *aryA (the 'D' in Data) 
aryB++, aryA++   - post-increments add one to each pointer
                   (i.e. move to the 'a' in Data, the 2nd uninitialised value
while (...)      - evaluates the assignment, exiting if false
                   the assignment evaluates to the copied character
                   only character code 0 / '\0' / NUL converts to false; others to true

我们现在有:

[(char*)aryA]---------------------------v
                                     ["Data Structures\0"]

[(char*)aryB]--------------v
                         [D                ]
                          ^
                          |
[(char*)argC]-------------/

重复。这样就可以逐个字符地复制,直到来自* aryA的数据是NUL字符,然后将其复制,然后赋值计算为false,循环终止。

虽然这一切都在发生,aryC仍然指向new - ed缓冲区的开头,因此现在可以用它来流式传输内容:

cout << aryC << endl;