strcpy中的指针赋值如何工作?

时间:2009-11-22 21:41:29

标签: c pointers

我正在看一个strcpy示例,它会增加指针的值,并将其分配为1行,如下所示:

*ptrA++ = *ptrB++;

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

做c之类的事情

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

在后台?

4 个答案:

答案 0 :(得分:7)

是的,记住postfix ++意味着在增量之前返回值。所以* ptrA ++递增ptrA但在递增之前返回ptrA的解除引用。

答案 1 :(得分:7)

嗯,是的,没有。

是的,因为您提供的第二段代码确实与原始代码完全相同。因此,在某种程度上,您可以正确理解原始代码。

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

*ptrA++ = *ptrB++;

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

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

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

实际上,增量将很可能首先发生,并且取消引用将在稍后发生。例如,编译器可以将原始表达式转换为类似

的内容
tmp1 = ptrA++;
tmp2 = ptrB++;
*tmp1 = *tmp2;

在这种情况下,首先发生增量。或者编译器可以将其转换为类似

的内容
ptrA++;
ptrB++;
*(ptrA - 1) = *(ptrB - 1);

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

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

P.S。关于这些序列点:C FAQC++ FAQWikipedia

答案 2 :(得分:2)

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

  

后缀运算符是运算符   是表达式的后缀。

     

操作数++;

     

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

答案 3 :(得分:1)

你明白了。 (15 char)