字符串复制功能:简单的问题

StringCopy function: simple issue

我有这个函数可以获取两个指向字符串的指针。

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/

    while( (*s = *t) != '[=10=]'){
        s++;
        t++;
    }
    return;
}

问题是:我看到它在 s++t++(即 "pointers, go to next character and check it")以及 *s++*t++ 下都有效。所以我问这不应该 *s++ 修改指针指向的字符吗?为什么效果一样?

使用一些示例字符串在 ubuntu 中编译。 提前致谢

有两部分。

首先

both with s++ and t++ (that means "pointers, go to next character and check it") and with *s++ and *t++.

嗯,你看到的结果是一样的,不代表他们是一样的。

如果片段像

    s++;
    t++;

    *s++;
    *t++;

它们产生相同的行为,就像在这两种情况下一样,只有 post 增量的副作用很重要(因为它们是 持久性 ,影响实际变量),而不是生成的结果(应用取消引用运算符的结果被丢弃)。

实际上,如果你尝试编译第二个版本(*s++; thingy),你会收到类似

的警告

Warning: value computed is not used [-Wunused-value]

然后,其次

shouldn't *s++ be modifying the character pointed by the pointer

不,请阅读 operator precedence。 post 增量绑定高于解引用运算符,副作用在结果计算值后开始,即解引用操作。

对于初学者来说,最好用限定符 const 声明第二个参数。

void copy(char *s, const char *t);

函数保证复制的源字符串不被更改,是函数与函数使用者之间的契约。

如果像这样声明函数会更好

char * copy(char *s, const char *t);

当函数 returns 指向结果字符串的第一个字符时。

至于原题那么如果你把函数写成

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/

    while( (*s = *t) != '[=12=]'){
        *s++;
        *t++;
    }
    // return;
}

则不使用表达式 *s++*t++ 的值。所以在这种情况下,取消引用指针是多余的操作。

但是,您可以按照以下方式编写函数,其中解除引用是有意义的

void copy(char *s, char *t){    /*copy the string pointed by t into string pointed by s*/

    while( ( *s++ = *t++) != '[=13=]');
    // return;
}