需要C语言strcpy方面的指导

需要C语言strcpy方面的指导,c,string,strcpy,C,String,Strcpy,此代码来自string.c中的strcpy 我试图了解这里的一些功能: char *(strcpy)(char *restrict s1, const char *restrict s2) { char *dst = s1; const char *src = s2; while ((*dst++ = *src++) != '\0') ; return s1; } while循环中发生了什么 (*dst++=*src++) 谢谢

此代码来自string.c中的strcpy 我试图了解这里的一些功能:

 char *(strcpy)(char *restrict s1, const char *restrict s2)
 {
     char *dst = s1;
     const char *src = s2;
     while ((*dst++ = *src++) != '\0')
         ;
     return s1;
 }
while循环中发生了什么

(*dst++=*src++)

谢谢

(*dst++=*src++)

这里发生了很多事情。 首先要注意的是,这是将
*src++
的值赋给
*dst++
。 星号取消了对dst++和src++的引用,因此这是一个字符对另一个字符的赋值。请注意,
++
运算符的优先级高于
*
(取消引用)运算符。看

第二个重要细节是增量是后缀<代码>++位于变量
dst
src
的右侧。因此,
dst
src
仅在while内的检查完成后递增。实际上,这将
dst
中的第一个字符设置为
src
中的第一个字符

因此,
dst
src
每增加一次
src
的第一个字符不是零字符
\0

关于第二个问题,请参见

src
被声明为
const char*
,因为它指向的字符未被修改,这通常是一种良好的做法。互联网上对此有很多讨论;例如。请注意,
src
本身(指针)在while循环中被明确修改。

(*dst++=*src++)

这里发生了很多事情。 首先要注意的是,这是将
*src++
的值赋给
*dst++
。 星号取消了对dst++和src++的引用,因此这是一个字符对另一个字符的赋值。请注意,
++
运算符的优先级高于
*
(取消引用)运算符。看

第二个重要细节是增量是后缀<代码>++位于变量
dst
src
的右侧。因此,
dst
src
仅在while内的检查完成后递增。实际上,这将
dst
中的第一个字符设置为
src
中的第一个字符

因此,
dst
src
每增加一次
src
的第一个字符不是零字符
\0

关于第二个问题,请参见


src
被声明为
const char*
,因为它指向的字符未被修改,这通常是一种良好的做法。互联网上对此有很多讨论;例如。请注意,
src
本身(指针)在while循环中被明显修改。

详细说明“为什么他们声明src为常量字符而不仅仅是字符”->
src
不是
const字符
src
是一个
const字符*
src
是一个指针。(1)
(*dst++=*src++)
将一个字符从源复制到目标并前进两个指针,因此下次它将复制下一个字符。由于赋值的结果是赋值,循环将在复制NUL后停止,NUL必须位于每个字符串的末尾。(2a)这样,如果它也是一个类似宏的函数,它就不会被扩展。(2b)返回类型为
char*
,因为它返回指向字符数组的指针,即字符串。(3) 告诉世界它不会修改
src
/试着在每篇文章中问一个问题,试着更好地解释你的困惑。但是char*dst也是如此。那么为什么要使用const呢?因为它确实修改了dst
dst
。所以,如果我想从一个数组复制到另一个数组,我可以说‘while((a++=b++)!='\0'),而不使用指针引用,在这样一个函数之外,有一个空的主体,这是可以接受的语法吗?也许比for循环做同样的事情更有效?详细说明“为什么他们声明src为const char而不仅仅是char”->
src
不是
const char
src
是一个
const字符*
src
是一个指针。(1)
(*dst++=*src++)
将一个字符从源复制到目标并前进两个指针,因此下次它将复制下一个字符。由于赋值的结果是赋值,循环将在复制NUL后停止,NUL必须位于每个字符串的末尾。(2a)这样,如果它也是一个类似宏的函数,它就不会被扩展。(2b)返回类型为
char*
,因为它返回指向字符数组的指针,即字符串。(3) 告诉世界它不会修改
src
/试着在每篇文章中问一个问题,试着更好地解释你的困惑。但是char*dst也是如此。那么为什么要使用const呢?因为它确实修改了dst
dst
。所以,如果我想从一个数组复制到另一个数组,我可以说‘while((a++=b++)!='\0'),而不使用指针引用,在这样一个函数之外,有一个空的主体,这是可以接受的语法吗?也许比for循环做同样的事情更有效?