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