【问题标题】:How does the pointer assignment in strcpy work?strcpy 中的指针赋值是如何工作的?
【发布时间】:2010-12-19 07:14:42
【问题描述】:

我正在查看一个 strcpy 示例,其中他们增加了指针的值,并将其分配在 1 行中,如下所示:

*ptrA++ = *ptrB++;

我知道char数组中指针指向的值增加了,内容被复制了。

c 会做类似的事情吗

*ptrA = *ptrB;
ptrA++;
ptrB++;

在后台?

【问题讨论】:

  • 是的,我刚刚注意到我的问题上方的提示。谢谢。

标签: c pointers


【解决方案1】:

是的,记住后缀 ++ 表示返回增量之前的值。所以 *ptrA++ 递增 ptrA 但在递增之前返回 ptrA 的取消引用。

【讨论】:

    【解决方案2】:

    嗯,是的,也不是。

    是的,因为您提供的第二段代码确实与原始代码做同样的事情。所以,在某种程度上,你正确地理解了你的原始代码。

    不,因为您的第二段代码并不真正等同于原始代码。请记住,说后缀++ 运算符返回原始值first 并增加指针later 是不正确的。在 C 语言中,时间关系(“之前”发生的事情和“之后”发生的事情)只能由序列点定义。表达式

    *ptrA++ = *ptrB++;
    

    里面没有序列点,所以绝对没有办法说之前发生了什么,之后发生了什么。同时,你的第二个变种

    *ptrA = *ptrB;
    ptrA++;
    ptrB++;
    

    明确保证增量发生在取消引用之后,因为在每个语句的末尾都有一个序列点。对于第一个变体,没有这样的保证。这是我认为您的解释有问题的地方。

    实际上很可能会先发生增量,然后再发生取消引用。例如,编译器可以将您的原始表达式翻译成类似

    tmp1 = ptrA++;
    tmp2 = ptrB++;
    *tmp1 = *tmp2;
    

    在这种情况下,增量首先发生。或者编译器可以把它翻译成类似的东西

    ptrA++;
    ptrB++;
    *(ptrA - 1) = *(ptrB - 1);
    

    在这种情况下,增量也会首先发生。

    再一次,记住你对原始表达的解释是好的,但这只是可能的解释之一。永远不要假设事情会按照您在解释中使用的特定顺序发生。

    附:关于这些序列点:C FAQC++ FAQWikipedia

    【讨论】:

    • 恕我直言,编译器可能在这两种情况下都可以进行指令重新排序。但是,是的,OP 的原始方法对于不太积极优化的编译器可能会更加明显。
    • 这是一篇简洁的文章。你能指出序列点的定义吗?
    • @Andres:见附言。部分答案
    • 对带有 tmp1 和 tmp2 的 sn-p 的吹毛求疵:说增量首先发生让我愣了一会儿。对 tmp1 和 tmp2 的分配仍在 ptrA 和 ptrB 递增之前发生,但我承认这很明显,但它可能会暂时混淆新的 C 编码器。
    • 所以在现实世界中我不能假设我的原始代码像我认为的那样工作,我应该先进行分配,然后增加指针?
    【解决方案3】:

    是的,确实如此。因为代码使用的是后缀运算符:

    后缀运算符是 以表达式为后缀。

    操作数++;

    这会导致 要返回的操作数。之后 结果得到,的值 操作数加 1。

    【讨论】:

      【解决方案4】:

      你明白了。 (15 个字符)

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 2021-01-07
        • 2021-04-21
        • 2020-08-17
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        相关资源
        最近更新 更多