从strcpy()
char * strcpy(char *s1, const char *s2)
{
char *s = s1;
while ((*s++ = *s2++) != 0);
return (s1);
}
为什么移交第二个参数有效,以及它如何在内存中查找,因为我没有传递指向函数的指针
char dest[100];
strcpy(dest, "HelloWorld");
答案 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");
正在传递给函数并在那里访问时, dest
和char
的数组将衰减到指向基本元素的指针。
"HelloWorld"
是字符串文字的类型为char []
(但不可修改),因此是传递的正确参数。