我经常使用函数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(),而不是一个指向字符串的指针。任何见解都会很感激的。
发布于 2018-07-19 10:28:33
这是由于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]);因此,在这些情况下,您不需要添加自己的&,如果这样做,这是不完全正确的,因为您最终得到的是“指向数组的指针”,而不是“指向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数组的指针”(或char *[]),这将是错误的。(它甚至可能最终看起来很有效,这可能会让你觉得它是正确的,但事实并非如此。)
发布于 2018-07-19 09:48:52
因为在C中字符串的类型是char[]:http://c0x.coding-guidelines.com/6.4.5.html
...For字符串文本,数组元素有char类型.
发布于 2018-07-19 09:54:48
我不明白为什么您可以直接传递一个字符串作为strcpy()的第二个参数,而不是一个指向该字符串的指针。任何见解都会很感激的。
您必须为这两个参数传递一个指向c-字符串的指针,或者至少要传递一个可以衰减到这样一个指针的指针。char数组类型char[] (它是字符串文本的类型)可以做到这一点。
记住,c-字符串不是一种类型。它是由第一个\0终止的连续字节序列。
下面是一个有启发性的例子:
char c[30] = "Hello\0 \0World!\n";
printf("%s%s%s\n", &c[0],&c[6],&c[8] );char数组c的大小为30。它包含三个c-字符串:"Hello“、”“和"World!\n”。它们的长度分别为5、1和7,它们在阵列中所占的空间分别为6、2和8。
https://stackoverflow.com/questions/51419276
复制相似问题