繁体   English   中英

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

[英]C++: C-strings, pointers, and a very interesting while loop

我看到一个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时遇到问题,所以我不能自己运行它,但即使我能想到我仍然可以从教我的人那里受益。

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

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

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

保存aryBaryC的,而之前只是一个指针保持到复制的字符串的开头,因为你那时递增失去它的方式aryB

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

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

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

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

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缓冲区的开头,所以它现在可以用来流出内容:

cout << aryC << endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM