版权声明:本博客为个人原创,转载请注明出处 https://blog.csdn.net/qq_33826564/article/details/81880554
关于 *p++ (C/C++)
目录
作为左值
void main()
{
char aa[] = "abaaa";
char b = ‘c’;
char * pa = aa;
*pa++ = b;
printf("%s\n", pa);
}
打印出来的是
baaa
这里*pa++ = b
的意思是,将b第一个元素 a 赋值给 pa 指向的字符数组的第一个元素,然后 pa 指针自加1(先引用再自加1)。
等价于*pa = b;
pa++;
(这里后置递增运算符 ++ 的优先级为1,取值符优先级为2,++
先进行,然后再*
)。(这里需要注意,无论是p++还是++p,单独作为一个语句的时候,两者并没有区别*)
C编译器认为*
和++
是同优先级操作符,且都是从右至左结合的,所以*p++
中的++
只作用在p
上,和*(p++)
意思一样;
可以用于字符数组的初始化,因为初始化当前元素之后,指针可以自动加1,以方便下一个元素的初始化
作为右值
int x,y;
int a[] = {1, 2, 3, 4, 5};
int *p = a;
执行之后
x = 1;
这里x = *p++;
等价于x = *p;
p++;
。(这里需要注意,无论是p++还是++p,单独作为一个语句的时候,两者并没有区别)
C编译器认为*
和++
是同优先级操作符,且都是从右至左结合的,所以*p++
中的++
只作用在p
上,和*(p++)
意思一样;
可以用于取出字符数组的元素,因为取出元素后,指针自动指向了下一位,方便了下一位的取出;
同时作为左值和右值
char aa[] = "dkfkds";
char * pa = aa;
char *ppa = pa;
*ppa++ = *pa++;
printf("%s\n", pa);
printf("%s\n", ppa);
最后输出的是
kfkds
kfkds
*ppa++ = *pa++;
可以等价为*ppa = *pa;
pa++;
ppa++;
(这里需要注意,无论是p++还是++p,单独作为一个语句的时候,两者并没有区别)
可以用来做字符数组的一对一赋值(同步赋值,复制),赋值结束后,两个字符数组都可以自动的移动到下一位,为继续同步赋值做准备