strcpy() 函数参数

Strcpy() function parameters

我在作业中经常使用函数 strcpy()。查看 strcpy():

的函数原型
char *strcpy(char *dest, const char *src)

可以看出strcpy()接受了两个指针

但是,我在网上以及我自己的代码中看到了很多示例,可以通过以下方式复制字符串并且它可以工作:

char array[30];
strcpy(array, "mystring");
printf("%s\n", array);

我的问题是,如果您传递的第二个参数是字符串,为什么 strcpy() 有效?第二个参数不需要是指向字符串的指针吗?例如。您不需要执行以下操作吗:

const char *str = "mystring";
char array[30];
strcpy(array, str);
printf("%s\n", array);

我很困惑为什么可以直接将字符串作为第二个参数传递给 strcpy() 而不是指向字符串的指针。任何见解将不胜感激。

因为在 C 中,字符串文字的类型是 char[] : http://c0x.coding-guidelines.com/6.4.5.html

[...For character string literals, the array elements have type char...]

I'm confused about why you can directly pass a string as the second parameter to strcpy() and not a pointer to the string. Any insights would be really appreciated.

你必须为两个参数传递一个指向 c 字符串的指针,或者至少传递一些可以衰减 到这样一个指针的东西。 char 数组类型 char[](这是字符串文字的类型)可以做到这一点。

请记住,C 字符串不是类型。它是由第一个 [=12=] 终止的连续字节序列。

这是一个很有启发性的例子:

char c[30] = "Hello[=10=] [=10=]World!\n";
printf("%s%s%s\n", &c[0],&c[6],&c[8] );

字符数组 c 的大小为 30。它包含三个 C 字符串:"Hello"、" " 和 "World!\n"。它们的长度分别为5、1、7,在数组中所占的space个数分别为6、2、8。

这是由于C语言中数组与指针的特殊关系

形式上,C 中的字符串是char 的数组。但是 C 中的指针 非常 可以很容易地用于访问数组,因此 'pointer to char' 通常与 'array of char' 一样用于处理字符串。此外,任何时候在需要其值的表达式中使用数组(包括字符串常量)时,您(自动)得到的是指向数组第一个元素的指针。

也就是说,如果你说

char array[10];
char *p = array;

正如你所说

char *p = &array[0];

并且由于字符串常量(形式上,字符串文字)是char的数组,如果你说

p = "mystring";

strcpy(array, "mystring");

跟你说的一样

p = &"mystring"[0];

strcpy(array, &"mystring"[0]);

所以在这些情况下你不需要添加你自己的 &,如果你这样做了,那就不太对了,因为你最终得到的是 'pointer to array' 而不是 'pointer to char' 这就是你想要的。

&"mystring"[0] 的语法很奇怪,没有人会使用它,这可能使这个解释非常混乱。让我们用稍微不同的方式来做。如果你说

char mystring[] = "mystring";
p = mystring;

strcpy(array, mystring);

跟你说的一样

p = &mystring[0];

strcpy(array, &mystring[0]);

当您调用 strcpy(array, &mystring[0]) 时,您会根据需要将 char * 传递给 strcpy。如果你打电话给

strcpy(array, &mystring);   /* WRONG */

您将传递 'pointer to array of char'(或 char *[]),这是错误的。 (它甚至可能最终看起来有效,这可能会让您误以为它是正确的,但事实并非如此。)