将char指针传递给函数的替代方法

时间:2016-02-26 14:32:33

标签: c string function pointers char

strcpy()

获取源代码
char * strcpy(char *s1, const char *s2)
{
    char *s = s1;
    while ((*s++ = *s2++) != 0);
    return (s1);
}

为什么移交第二个参数有效,以及它如何在内存中查找,因为我没有传递指向函数的指针

char dest[100];
strcpy(dest, "HelloWorld");

3 个答案:

答案 0 :(得分:8)

这很有效,因为,

  • 对于dest,数组作为函数参数传递时,会衰减到第一个元素的地址。那是一个指针。

    所以,像

    之类的电话
     strcpy(dest, "HelloWorld");
    

    相同
    strcpy(&dest[0], "HelloWorld");
    
  • 对于"HelloWorld",字符串文字的类型为char[]。因此,它基本上为您提供了第一个元素的地址。

答案 1 :(得分:3)

在C字符串中,文字具有字符数组的类型。来自C标准(6.4.5字符串文字)

  

6在转换阶段7中,附加一个值为零的字节或代码   每个由字符串文字产生的多字节字符序列   或者文字.78)然后使用多字节字符序列   初始化一个静态存储持续时间和长度的数组   足以包含序列。对于字符串文字,   数组元素的类型为char,并使用   多字节字符序列的各个字节。

具有罕见异常的数组也会转换为表达式中的指针。 C标准,6.3.2.1左值,数组和函数指示符

  

3除非它是sizeof运算符或一元&的操作数。   operator,或者是用于初始化数组的字符串文字,a   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。

因此在这次电话会议中

strcpy(dest, "HelloWorld");

字符串文字的类型为char[11],转换为类型char *的值,该值等于字符串文字的第一个字符的地址。

您也可以编写例如

strcpy(dest, &"HelloWorld"[0]);

甚至:)

strcpy(dest, &0["HelloWorld"]);

或:)

strcpy(dest, &*"HelloWorld");

所有三个表达式都会产生字符串文字的初始元素的地址,并且类型为char *。 考虑到它是实现定义的(通常由编译器选项控制)是否

"HelloWorld" == "HelloWorld"

评估为true。这就是编译器是否为相同的字符串文字分配单独的内存范围,或者只存储它们的一个副本。

在此表达式中,将比较字符串文字的第一个字符的地址。

如果你写

strcmp( "HelloWorld", "HelloWorld" )

然后结果将等于0,即字符串文字彼此相等(包含相同的字符序列)

答案 2 :(得分:1)

strcpy(dest, "HelloWorld");
正在传递给函数并在那里访问时,

destchar的数组将衰减到指向基本元素的指针。

"HelloWorld"是字符串文字的类型为char []但不可修改),因此是传递的正确参数。