我经常使用函数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()
感到困惑。任何见解将不胜感激。
答案 0 :(得分:3)
因为在C语言中,字符串文字的类型为char[]
:http://c0x.coding-guidelines.com/6.4.5.html
[...对于字符串文字,数组元素的类型为char ...]
答案 1 :(得分:1)
这是由于C中数组与指针之间的特殊关系。
形式上,C中的字符串是char
的数组。但是C语言中的指针可以非常容易地用于访问数组,因此,“ char
的指针”与“ char
的数组”一样,通常是用于操纵字符串的类型。是。此外,每次在需要其值的表达式中使用数组(包括字符串常量)时,(自动)获得的就是指向数组第一个元素的指针。
也就是说,如果你说
char array[10];
char *p = array;
就像你说的那样
char *p = &array[0];
并且由于字符串常量(通常为字符串文字)是char
的数组,如果您说
p = "mystring";
或
strcpy(array, "mystring");
就像你说的一样
p = &"mystring"[0];
或
strcpy(array, &"mystring"[0]);
因此,在这种情况下,您无需添加自己的&
,如果这样做,那是不正确的,因为最终的结果是“指向数组的指针”而不是“指向{的指针” {1}}”就是您想要的。
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 */
(或char
)数组的指针,这是错误的。 (它甚至可能看起来似乎还可以工作,这可能会使您误以为它是正确的,但事实并非如此。)
答案 2 :(得分:0)
我对为什么可以直接将字符串作为第二个参数传递给strcpy()而不是指向该字符串的指针感到困惑。任何见解将不胜感激。
对于两个参数,您都必须将指针传递给c字符串,或者至少可以传递衰减到此类指针。 char类型char[]
(字符串文字的类型)可以做到这一点。
请记住,尽管c字符串不是类型。它是一个连续的字节序列,以第一个\0
结尾。
这是一个启发性的例子:
char c[30] = "Hello\0 \0World!\n";
printf("%s%s%s\n", &c[0],&c[6],&c[8] );
字符数组c
的大小为30。它包含三个c字符串:“ Hello”,“”和“ World!\ n”。它们的长度分别为5、1和7,它们在阵列中占据的空间分别为6、2和8。