当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《strcpy中的指针赋值如何工作?》经验,为你挑选了2个好方法。

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

*ptrA++ = *ptrB++;

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

做c之类的事情

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

在后台?



1> Ramónster..:

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



2> AnT..:

嗯,是的,不.

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

不,因为你的第二段代码与原始代码并不完全相同.请记住,这是不正确的说,后缀++运算符返回原来的价值第一,并增加指针.在C语言中,时间关系("之前"发生的事情和"之后发生的事情")只能由序列点定义.表达方式

*ptrA++ = *ptrB++;

内部没有序列点,所以绝对没有办法说出之前发生的事情以及之后发生的事情.与此同时,你的第二个变种

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

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

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

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

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

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

在这种情况下,增量首先发生.

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

PS关于这些序列点:C FAQ,C++ FAQ,Wikipedia

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有