如何解决* ++ a和++ * b有什么区别?
在下面的程序中,'c'指针尚未修改。不过,它仍在打印数组的第二个元素,而不是第一个元素,即“ a”。谁能解释这种行为?前两个字符正确打印,但第三个字符不正常。
#include <stdio.h>
int main()
{
char arr[] = {'a','m','r'};
char *a = arr;
char *b = arr;
char *c = arr;
*++a;
++*b;
printf("%c %c %c",*a,*b,*c);
return 0;
}
输出:
m b b
解决方法
char arr[] = {'a','m','r'};
/|\
a b c
*++a;
之后的
char arr[] = {'a','r'};
/\ |
b c a
++*b;
之后的
char arr[] = {'b','r'};
/\ |
b c a
,
最初a
,b
和c
都指向数组的第一个元素。
*++a;
==>该操作将地址递增,因此它将指向下一个位置并尊重其中的值,因此它将指向下一个位置,即m
++*b;
==>在这里,您要递增b中包含的值,即a
,因此递增后它变成b
* c ==>指向上一个操作的增量值,即b
让我们考虑prefix
,postfix
和*
解引用运算符的优先级和关联性。
-
优先级:
Postfix
的优先级高于* dereference operator
和prefix
运算符。但是prefix
和* dereference operator
具有相同的优先级。我们必须考虑相同优先级运算符的关联性。 -
关联性:
prefix
和* dereference operator
的从右到左。 -
最初,
a
,b
,c
存储数组的第一个元素的地址。 -
*++a
可以表示为*(++a)
,因为关联性是从右到左。 (请注意:prefix
和* dereference operator
具有相同的优先级。) -
因此,
*(++a)
=*(a+1)
=m
-
++*b
可以表示为++(*b)
=++(a)
=b
(自*b = a
起) -
自此以来,数组第一个地址的值已更改,
*c
=b
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。