2014-03-19 52 views
0

我一直在学习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就是没有,因为没有价值。现在在循环之后,ab都没有显示任何结果。这是我迷失的地方。我使用*来解引用ab,并将值a分配到b。我哪里做错了?我需要使用&吗?

解决方案:在循环完成

后,指针*a指向arrayA的端部和指针*b指向arrayB的末尾。所以要获得arrayB的完整结果只需cout << arrayB。或者创建一个永不改变的指针,并且在循环结束时始终指向arrayB char *c = arrayBcout << c

+0

注意,NULL不是空字符,它是写为 '\ 0'。 NULL是一个表示空指针的C宏,不应该在C++中使用(对于指针,使用新的文字nullptr,或者简单地使用0)。 –

+0

@Peter Schneider谢谢。做了必要的更改。 – MrPilot

+0

哦,并且不要使用未初始化的数组,例如用于输出(比如“beforeLoop”之后的arrayB)。在第一个字符中写入'\ 0',以便它变成空字符串。你的程序只能巧合使用(除非数组是全局的,在这种情况下它们被置零)。 –

回答

3

循环ab发生变化后,它们将指向字符串的末尾。您需要制作指针的副本以逐步执行,以便在迭代时不会更改ab的位置。

3

问题是你正在输出用于遍历数组的临时变量。它们现在处于复制数据的末尾。您应该输出值arrayAarrayB

+0

感谢您的输入。我很感激。 – MrPilot

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; 
相关问题