语句 * p ++ = * source ++; 在以下第一个程序中不会导致任何错误,但会导致错误 ISO C ++禁止转换为非引用类型用作左值< / em>在编译时的第二个程序中。为什么会这样?
第一个程序
#include
char *my_strcpy(char *destination, char *source)
{
char *p = destination;
while (*source != '\0')
{
*p++ = *source++;
}
*p = '\0';
return destination;
}
int main()
{
char source[] = "A string to be used for demonstration purposes";
char destination[80];
my_strcpy(destination, source);
puts(destination);
return 0;
}
第二个程序
#include
char source[] = "A string to be used for demonstration purposes";
char destination[80];
int main()
{
char *p = destination;
putchar('\n');
while(*source != '\0')
{
*p++ = *source++;
}
*p = '\0';
puts(destination);
return 0;
}
答案 0 :(得分:2)
这是因为您的第一个程序递增指针,而在第二个程序中,您将++
运算符应用于数组。虽然数组通常表现得像指针,但它们不是指针。数组支持指针算术,但它们不支持将它们视为lvalue
的指针运算符(即尝试修改它们指向的位置)。
修复问题很简单 - 只需创建一个指向数组的指针,并在循环中使用该指针,如下所示:
char *p = destination;
putchar('\n');
char *src = source;
while(*src != '\0')
{
*p++ = *src++;
}
*p = '\0';
puts(destination);
return 0;
答案 1 :(得分:1)
在第一个程序中source
通过将其传递给my_strcpy
而转换为指向char的指针,因此您可以将其递增。另一方面,在第二个程序中,source
仍然是一个数组,并且您无法递增数组。
顺便说一句,我认为C库以非常简短的方式实现strcpy
,如下所示:
while((*dst++ = *src++));
这就是全部
答案 2 :(得分:0)
您无法修改源代码,您已创建一个指向它的本地指针,就像使用p作为目标一样。 source是一个静态定义的数组,因此您只能更改其内容,而不能更改其地址。