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 *[]
),这是错误的。 (它甚至可能最终看起来有效,这可能会让您误以为它是正确的,但事实并非如此。)
我在作业中经常使用函数 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 *[]
),这是错误的。 (它甚至可能最终看起来有效,这可能会让您误以为它是正确的,但事实并非如此。)