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;