关于 *p++ 分别作为左值,右值,左右值的操作(C/C++)

关于 *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,单独作为一个语句的时候,两者并没有区别

可以用来做字符数组的一对一赋值(同步赋值,复制),赋值结束后,两个字符数组都可以自动的移动到下一位,为继续同步赋值做准备

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值