C:很难理解这段代码的while循环中的指针

时间:2017-12-20 19:09:07

标签: c pointers

我使用调试器来阅读此代码,并且我对while ((*d++ = *s2++));感到困惑 - 在调试器变量中,d似乎在每个循环之后缩短(从{{1开始)当'Hello hello'更改为'ello hello'时,{}为s1。循环的while循环是什么(不应该是'cello hello'

为什么d和s1的变量值不相同(isn' t d是指向s1的指针)?当他们返回主函数时,while(condition); do(something)) =指针curdst

dst

1 个答案:

答案 0 :(得分:2)

这是strcpy()的一个相当典型的教学实现。它的工作原理如下:

  • my_strcpy()有两个参数。第一个参数是指向目标字符数组的第一个元素的指针。第二个参数是指向源字符串的第一个元素的指针,即由NUL(又名\0)字符终止的字符数组。该函数将字符串从源字符串复制到目标缓冲区,包括NUL终结符,并返回指向目标缓冲区的第一个元素的指针。

    char *my_strcpy(char *s1, const char *s2) {
    
  • 首先,复制第一个参数,因为我们需要在复制完成后返回它。

    char *d = s1;
    
  • 然后,复制字符;这是在一个紧凑的循环中完成的,工作方式如下:

    • 将当前字符* s2复制到d指向的位置,就像执行* d = * s2一样;然后
    • d增加为指向目标缓冲区中的下一个位置,就像执行d++并将s2增加为指向要复制的下一个字符一样,就像执行{{1}一样};和
    • 如果复制的最后一个字符是s2++
    • ,则退出循环

    这是以非常简洁的方式写的:

    NUL

    while (* d++ = * s2++); 表示“接受* s2++指向的字符,然后递增s2”。类似地,s2作为左手值意味着“使用* d++指向的变量然后递增d”。运算符的优先顺序有助于省略括号,因为d的优先级高于++,其优先级高于*。赋值的值是赋值,因此当赋值的值为0时,循环结束。

  • 最后,返回=,该函数未更改。

    s1