C++ C++;使用指针复制char*

C++ C++;使用指针复制char*,c++,arrays,pointers,char,C++,Arrays,Pointers,Char,我试图掌握指针,我有这个简单的代码,我需要一些解释 我需要将一个字符数组复制到另一个字符数组。在我的主要功能中,我有以下代码: const int MAX_SIZE = 100; char x[MAX_SIZE] = "1234565"; char* y = new char[MAX_SIZE]; copyArray(x, y); std::cout << y; delete [] y; 与此不同(结尾给出奇怪的字符): 从这个角度看,这两个函数似乎非常相似。 在源字

我试图掌握指针,我有这个简单的代码,我需要一些解释

我需要将一个字符数组复制到另一个字符数组。在我的主要功能中,我有以下代码:

const int MAX_SIZE = 100;

char x[MAX_SIZE] = "1234565";
char* y = new char[MAX_SIZE];

copyArray(x, y);    
std::cout << y;

delete [] y;
与此不同(结尾给出奇怪的字符):

从这个角度看,这两个函数似乎非常相似。 在源字符串中找到空终止符之前进行复制是有意义的,对吗(第二个函数)

但是它不能正常工作-我在复制的数组末尾得到了一些奇怪的字符。但是,第一个函数工作得很好

void copyArray(const char* source, char* dest);
(*dest=*source)
是一个经过计算的表达式,就像
inti=1+1的1+1部分一样
不同之处在于,
((*dest=*source)!='\0')
中,*source的值分配给*dest,然后计算整个表达式(表达式的值与
*source
相同),而
*source
所指的值仅用于计算
*source!='\0'
,但在对该语句求值期间从未赋值


编辑

user0042带来了一个真正敏锐的观察:通过这样做,下面的代码

while ((*dest = *source) != '\0')
{
    dest += 1;
    source += 1;
}

确保数组的最后一个字符的值为“\0”

在示例中,您将递增地址
x,y
,直到最后一个字符指向空终止符,因此您必须声明一个临时变量来保存第一个地址:

char* x = "1234565";
char* y = new char[MAX_SIZE];

// Temporary pointers to hold the first element's address
char* tmp1 = x;
char* tmp2 = y;

while( (*y = *x) != '\0'){
    x += 1; // X no longer points to the first element
    y += 1; // Y no longer points to the first element
}

std::cout << tmp2;
因为在递增之前分配值,所以最后一个字符
\0
将在添加到目标指针
y
之前中断循环。因此,我不是在
n='\0'
上断开循环,而是在
n-1='\0'
上断开循环,以确保它被添加到表单中

while ((*dest = *source) != '\0')
{
    dest += 1;
    source += 1;
}
如果终止的
'\0'
字符被计算为
false,则保证在测试条件之前应用要复制的字符的赋值(
(*dest=*source)

第二个版本不复制终止的
'\0'
字符,因为循环在

*dest = *source;

语句。

对,我做了两次建议的标记,抱歉
,而((*dest=*source)!='\0')
保证在循环结束之前复制必要的终止
'\0'
字符。另请参见第二个示例,您的意思是当它遇到“\0”时将中断循环,这意味着它不会终止字符串?是的,我的意思正是这样。@daavid245详细信息:
while(*source!='\0')
循环不会“不会终止字符串”。它不会终止字符数组。字符数组只有在具有空字符时才是字符串。在这两个示例中,字符数组的增量分别为
x
y
char* x = "1234565";
const int size = strlen(x);
char* y = new char[size];

char* tmp1 = x;
char* tmp2 = y;

do{
    *y = *x;
    x += 1;
    y += 1;
}while( *(x - 1) != '\0');

// Now no need for adding a null-terminator it is already added in the loop
//  tmp2[size] = '\0';

std::cout << tmp2;
while ((*dest = *source) != '\0')
{
    dest += 1;
    source += 1;
}
*dest = *source;