我一直在学习C ++已经有一段时间了,而且当谈到指针时,我遇到了一个“障碍”。我正在使用它作为我的http://www.cplusplus.com/doc/tutorial/pointers/学习材料,但我仍然遇到问题。所以为了测试我想要将一个数组的内容复制到另一个数组中。我写了以下内容。
char arrayA[15] = "abcdef";
char arrayB[15];
char *a = arrayA;
char *b = arrayB;
cout << "before loop:" << endl;
cout << a << endl;
cout << b << endl;
while (*a != '\0') {
// Copy the contents of a into b
*b = *a;
// Step
a++;
b++;
}
// Assign null to the end of arrayB
*b = '\0';
cout << "after loop:" << endl;
cout << a << endl;
cout << b << endl;
我得到以下结果。
before loop:
abcdef
after loop:
当我cout
循环前的内容时,我得到了预期的结果。 a
包含“abcdef”而b
没什么,因为还没有价值。现在循环结束后,a
和b
都没有显示任何结果。这是我迷失的地方。我使用*
取消引用a
和b
,并将a
的值分配到b
。我哪里做错了?我需要使用&
吗?
解决方案:
循环完成后,指针*a
指向arrayA的末尾,指针*b
指向arrayB的末尾。因此,只需cout << arrayB
即可获得arrayB的完整结果。或者创建一个永不改变的指针,并始终在循环结束时指向arrayB char *c = arrayB
和cout << c
。
答案 0 :(得分:3)
在循环a
和b
发生变化后,它们会指向字符串的结尾。您需要复制指针以便逐步执行,以便在您迭代时不要更改a
和b
的位置。
答案 1 :(得分:3)
问题是您输出的是用于迭代数组的临时变量。它们现在位于复制数据的末尾。您应该输出arrayA
和arrayB
的值。
答案 2 :(得分:0)
记住数组的开头。在这一刻,你在增加指针并在循环结束后打印在数组末尾指向它们的东西。
char arrayA[15] = "abcdef";
char arrayB[15];
char *a_beg = arrayA;
char *b_beg = arrayB;
char *a;
char *b;
cout << "before loop:" << endl;
cout << a_beg << endl;
cout << b_beg << endl;
a = a_beg;
b = b_beg;
while (*a != '\0') {
// copy contents of a into b and increment
*b++ = *a++;
}
// assign null to the end of arrayB
*b = '\0';
cout << "after loop:" << endl;
cout << a_beg << endl;
cout << b_beg << endl;