指向 char 的指针 - 增量运算符
Pointers to char - Increment operator
恐怕我没有正确理解运算符之间的优先级。以下程序的工作方式与预期不同:
#include<stdio.h>
int main(){
char a[] = "abc";
char *p;
int i;
p = a;
for(i = 0; i < 3; ++i) /* First case */
printf("%c\n", *p++);
printf("a = %s\n", a);
p = a;
for(i = 0; i < 3; ++i) /* Second case */
printf("%c\n", (*p)++);
printf("a = %s\n", a);
return 0;
}
第一种情况:根据这个table,*p++
就是*(p++)
。我递增 p
、 指向的地址,然后 我取消引用它。为什么它 return 是 abc
,而不是 bc + "value beyond string"
?
我在第二种情况下遇到了类似的问题,表达式为(*p)++
。在这种情况下,括号让我增加了 p 的 dereferentiated 值。因此,我希望表达式为 return bcd
而不是 dbc
。
在第一种情况下它执行指针递增在返回它的值之后,因为操作是post-增量。
在第二种情况下,您在循环中递增 *p
, 3 次而不更改 p
本身的值。因此 a
的第一个元素(p
指向)递增 3 次导致 'a'+3='d'
。其余元素保持不变
第一个案例:
迭代1:i=0,*p=a,指向'abc'。
现在在这条语句之后 p 将指向 'b' 和 i =1
迭代2:i=1,*p=b,指向'abc'。
现在在这条语句之后 p 将指向 'c' 和 i =2
迭代3:I=2,*p = c,指向'abc'。
现在在这条语句之后 p 将指向 null 终止字符并且 i=3
迭代4:循环中断,a仍然指向'abc'
第二种情况:
迭代1:i=0,*p = 'a',a指向'abc'。
在此语句之后,p 点增加的值因此指向 'bbc' 和 i=1
迭代2:i=1,*p='b',指向'bbc'。
在此语句之后,p 点增加的值因此指向 'cbc' 和 i=2
迭代3:i=2,*p='c',a指向'cbc'。
在此语句之后,p 点增加的值因此指向 'dbc' 和 i= 3
迭代 4:循环中断并且 a 指向 'dbc'
p 指向 'd'
恐怕我没有正确理解运算符之间的优先级。以下程序的工作方式与预期不同:
#include<stdio.h>
int main(){
char a[] = "abc";
char *p;
int i;
p = a;
for(i = 0; i < 3; ++i) /* First case */
printf("%c\n", *p++);
printf("a = %s\n", a);
p = a;
for(i = 0; i < 3; ++i) /* Second case */
printf("%c\n", (*p)++);
printf("a = %s\n", a);
return 0;
}
第一种情况:根据这个table,*p++
就是*(p++)
。我递增 p
、 指向的地址,然后 我取消引用它。为什么它 return 是 abc
,而不是 bc + "value beyond string"
?
我在第二种情况下遇到了类似的问题,表达式为(*p)++
。在这种情况下,括号让我增加了 p 的 dereferentiated 值。因此,我希望表达式为 return bcd
而不是 dbc
。
在第一种情况下它执行指针递增在返回它的值之后,因为操作是post-增量。
在第二种情况下,您在循环中递增 *p
, 3 次而不更改 p
本身的值。因此 a
的第一个元素(p
指向)递增 3 次导致 'a'+3='d'
。其余元素保持不变
第一个案例:
迭代1:i=0,*p=a,指向'abc'。 现在在这条语句之后 p 将指向 'b' 和 i =1
迭代2:i=1,*p=b,指向'abc'。 现在在这条语句之后 p 将指向 'c' 和 i =2
迭代3:I=2,*p = c,指向'abc'。 现在在这条语句之后 p 将指向 null 终止字符并且 i=3
迭代4:循环中断,a仍然指向'abc'
第二种情况:
迭代1:i=0,*p = 'a',a指向'abc'。 在此语句之后,p 点增加的值因此指向 'bbc' 和 i=1
迭代2:i=1,*p='b',指向'bbc'。 在此语句之后,p 点增加的值因此指向 'cbc' 和 i=2
迭代3:i=2,*p='c',a指向'cbc'。 在此语句之后,p 点增加的值因此指向 'dbc' 和 i= 3
迭代 4:循环中断并且 a 指向 'dbc' p 指向 'd'