为什么strcpy使用const char *代替src而不是char *?

时间:2016-01-26 10:34:37

标签: c pointers

我实现了自己的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 *?

3 个答案:

答案 0 :(得分:6)

  

strcpy是否有任何理由将源指针作为char *而不是const char *?

源指针应为const char *。原因对于所有不打算在函数内意外更改源的函数(不只是strcpy)都是常见的。

这种做法适用于strcpy等库函数或您自己的自定义函数。与像strcpy这样的库函数一样,源意外更改的可能性也不大。但对于您自己(或其他所有人)的自定义函数,任何事情都可能发生。如果你确实修改了意外,那么你会得到一个编译错误告诉你。那就是const正在发挥作用的时候。

答案 1 :(得分:3)

“在下面的2中找不到任何区别” - 在你最疯狂的梦想中,差异是什么?

const声明的唯一区别在于调用方的通过const参数声明,函数承诺不会改变通过指针访问的内存。它承诺只读取它,这与strcpy()的语义一致。 (注意:函数是否实际上不通过指针是完全无法保证的。但它承诺。)

因此调用者可以使用指向常量数据的指针调用该函数,并假设该函数不会尝试写入该函数。

这在句法上,逻辑上和物质上都很重要:

  • 该语言允许调用者提供一个指向const数据的指针作为参数(它不允许你的第一个非const版本)。
  • 调用者可以确保敏感数据不会在函数内部被更改为副作用;想象一下这里指向内核数据结构的指针。 (反例:strtok()写入原始字符串,因此不会声明为const!)
  • 数据可能是物理上只读的(例如,它可能会被刻录到控制器的ROM中),因此尝试写入数据会引起优秀的Max Barry:a {{3 }}

答案 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 *类型的对象。

相关问题