【问题标题】:Alternative way to pass a char pointer to a function将 char 指针传递给函数的替代方法
【发布时间】:2016-06-09 19:49:21
【问题描述】:

鉴于strcpy()的源代码

char * strcpy(char *s1, const char *s2)
{
    char *s = s1;
    while ((*s++ = *s2++) != 0);
    return (s1);
}

为什么交出第二个参数会起作用以及它在内存中的样子,因为我没有将指针传递给函数

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

【问题讨论】:

    标签: c string function pointers char


    【解决方案1】:

    这行得通,因为,

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

      所以,像这样的电话

       strcpy(dest, "HelloWorld");
      

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

    【讨论】:

    • 我实际上想知道“HelloWorld”参数。很抱歉没有指出这一点
    • "HelloWorld" 还有char[] 数组。
    • “HelloWorld”是右值吗?
    • @SebTu 什么右值?在什么情况下?
    【解决方案2】:

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

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

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

    3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

    因此在此调用中

    strcpy(dest, "HelloWorld");
    

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

    你也可以写例子

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

    甚至:)

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

    或:)

    strcpy(dest, &*"HelloWorld");
    

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

    "HelloWorld" == "HelloWorld"
    

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

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

    如果你写

    strcmp( "HelloWorld", "HelloWorld" )
    

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

    【讨论】:

    • 最后一个不行。我想你的意思是strcpy(dest, &0["HelloWorld"]);
    • @IanAbbott 谢谢。这是一个错字。:)
    【解决方案3】:
    strcpy(dest, "HelloWorld");
    

    destchar 的数组在传递给函数并在那里访问时将衰减为指向基元素的指针。

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

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2011-05-22
      • 2018-09-16
      相关资源
      最近更新 更多