在下面的程序中,'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
答案 0 :(得分:2)
char arr[] = {'a','m','r'};
/|\
a b c
*++a;
之后的
char arr[] = {'a','m','r'};
/\ |
b c a
++*b;
之后的
char arr[] = {'b','m','r'};
/\ |
b c a
答案 1 :(得分:1)
最初a
,b
和c
都指向数组的第一个元素。
*++a;
==>该操作将地址递增,因此它将指向下一个位置并尊重其中的值,因此它将指向下一个位置,即m
++*b;
==>在这里,您要递增b中包含的值,即a
,因此递增后它变成b
* c ==>指向上一个操作的增量值,即b
答案 2 :(得分:0)
让我们考虑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
。