我实现了自己的strcpys来查找src与const char *&之间是否有任何区别char *,但没有发现以下2&两者都是一样的。
char * my_strcpy(char*dest, char* src)
{
while ('\0' != *src)
*dest++ = *src++;
*dest++ = '\0';
return dest;
}
char * my_strcpy2(char*dest, const char* src)
{
while ('\0' != *src)
*dest++ = *src++;
*dest++ = '\0';
return dest;
}
有没有理由strcpy将源指针作为const char *而不是char *?
答案 0 :(得分:6)
strcpy是否有任何理由将源指针作为char *而不是const char *?
源指针应为const char *
。原因对于所有不打算在函数内意外更改源的函数(不只是strcpy
)都是常见的。
这种做法适用于strcpy
等库函数或您自己的自定义函数。与像strcpy
这样的库函数一样,源意外更改的可能性也不大。但对于您自己(或其他所有人)的自定义函数,任何事情都可能发生。如果你确实修改了意外,那么你会得到一个编译错误告诉你。那就是const
正在发挥作用的时候。
答案 1 :(得分:3)
“在下面的2中找不到任何区别” - 在你最疯狂的梦想中,差异是什么?
const声明的唯一区别在于调用方的。通过const参数声明,函数承诺不会改变通过指针访问的内存。它承诺只读取它,这与strcpy()
的语义一致。 (注意:函数是否实际上不通过指针是完全无法保证的。但它承诺。)
因此调用者可以使用指向常量数据的指针调用该函数,并假设该函数不会尝试写入该函数。
这在句法上,逻辑上和物质上都很重要:
strtok()
写入原始字符串,因此不会声明为const!)答案 2 :(得分:0)
对于初学者,函数strcpy
返回指向目标字符串的指针。您的函数还应该返回指向目标字符串的指针。对于在C标准中处理字符串的函数,这是一种常见的约定。
因此该函数可以采用以下方式
char * my_strcpy( char *dest, const char *src )
{
char *p = dest;
while ( *p++ = *src++ );
return dest;
}
在这种情况下,可以通过以下方式调用它
const char *hello = "Hello, World!";
char s[14];
puts( s, hello );
将函数的第二个参数指定为指向常量字符串的指针意味着1)该函数保证它不会改变指向的字符串,2)允许传递给函数常量字符串。
指向非常量对象的指针可以隐式转换为指向常量对象的指针。没有显式转换,不允许进行反向操作。
因此,如果将参数声明为指向常量字符串的指针,则可以将非常量字符串与常量字符串一起传递给与参数相同的函数。否则,无法使用常量字符串调用该函数,因为编译器将发出错误消息,指出它无法将类型为const char *
的对象转换为char *
类型的对象。