首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Strcpy()函数参数

Strcpy()函数参数
EN

Stack Overflow用户
提问于 2018-07-19 09:40:20
回答 3查看 2.2K关注 0票数 0

我经常使用函数strcpy()来分配任务。查看strcpy()的函数原型

代码语言:javascript
复制
char *strcpy(char *dest, const char *src)

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

但是,我在网上和我自己的代码中都看到,可以以以下方式复制字符串,并且它会工作:

代码语言:javascript
复制
char array[30];
strcpy(array, "mystring");
printf("%s\n", array);

我的问题是,如果要传递的第二个参数是字符串,为什么strcpy()要工作呢?第二个参数不需要是指向字符串的指针吗?你不需要做以下事情吗?

代码语言:javascript
复制
const char *str = "mystring";
char array[30];
strcpy(array, str);
printf("%s\n", array);

我不明白为什么您可以直接将字符串作为第二个参数传递给strcpy(),而不是一个指向字符串的指针。任何见解都会很感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-19 10:28:33

这是由于C中数组和指针之间的特殊关系。

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

也就是说,如果你说

代码语言:javascript
复制
char array[10];
char *p = array;

就好像你说过

代码语言:javascript
复制
char *p = &array[0];

因为字符串常量(形式上,字符串文本)是char的数组,如果您说

代码语言:javascript
复制
p = "mystring";

代码语言:javascript
复制
strcpy(array, "mystring");

就好像你说过

代码语言:javascript
复制
p = &"mystring"[0];

代码语言:javascript
复制
strcpy(array, &"mystring"[0]);

因此,在这些情况下,您不需要添加自己的&,如果这样做,这是不完全正确的,因为您最终得到的是“指向数组的指针”,而不是“指向char的指针”,这正是您想要的。

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

代码语言:javascript
复制
char mystring[] = "mystring";
p = mystring;

代码语言:javascript
复制
strcpy(array, mystring);

就好像你说过

代码语言:javascript
复制
p = &mystring[0];

代码语言:javascript
复制
strcpy(array, &mystring[0]);

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

代码语言:javascript
复制
strcpy(array, &mystring);   /* WRONG */

您将传递一个“指向char数组的指针”(或char *[]),这将是错误的。(它甚至可能最终看起来很有效,这可能会让你觉得它是正确的,但事实并非如此。)

票数 1
EN

Stack Overflow用户

发布于 2018-07-19 09:48:52

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

...For字符串文本,数组元素有char类型.

票数 3
EN

Stack Overflow用户

发布于 2018-07-19 09:54:48

我不明白为什么您可以直接传递一个字符串作为strcpy()的第二个参数,而不是一个指向该字符串的指针。任何见解都会很感激的。

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

记住,c-字符串不是一种类型。它是由第一个\0终止的连续字节序列。

下面是一个有启发性的例子:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51419276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档