*++a 和 ++*b 有什么区别?
What is the difference between *++a and ++*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','m','r'};
/\ |
b c a
在++*b;
之后
char arr[] = {'b','m','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
.
在下面的程序中,'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','m','r'};
/\ |
b c a
在++*b;
char arr[] = {'b','m','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
.