*和++的羁绊

前置条件

#include<stdio.h>

int main(){

int num[5]={1,3,5,7,11};//num数组里有五个连续的质数

int *p;//定义一个指向整数类型的指针

p=num;让指针地址为数组第一个元素

return 0;

}

假定p是一个指向整数的指针,区分*p++;*(p++);(*p)++;++(*p);*++p;*(++p);++*p

首先搞清楚*和++的运算符是同级的,且运算是从右到左,此外,()的优先级最高,在打印诸如上述式子时,不仅有运算顺序的区别,还有返回值的区别

1)*p++和*(P++)是相同的:从右到左执行,先做自增行为(此处的自增是将p的地址往后一个整数型别单位),再*p解引用,又因为++在后面,因此解引用的是没有自增前的p

所以,分别印出这两个数字如图

 第一次打印的值是1,第二次打印的值是3,此时p已经指向了第三个元素,num[2]

2)*++p和*(++p)相同:先自增,再解引用,与1)的区别是,此处解引用的是自增后的p

如图,此处打印的是3和5,此时p指向num[2]

3)++(*p)和++*p相同,都是从右向左,先解引用,再自增,因为++在前,因此打印的值是*p自增后的值 

此处分别打印出了2,3,此时,p的指向仍然为num[0] 

4)(*p)++:即先解引用,再自增,同理,返回自增前的值 

如图,运行两次,一次印出1,一次印出2,p仍然指向num[0],但是num[0]已经为3

以上就是七种(实际上是四种,两种地址自增(返回前值和返回后值),两种值自增,地址不变(返回前值和返回后值)) 变化

接下里通过之前的学习中诸如a=b++;和a=++b的问题

int a=1,b=2;

1)a=b++:b先自增,再将b自增前值复制给a,因此printf输出a结果是2,输出b结果是3

2)a=++b:先自增b,再把b自增后值复制到a

总之,++在前复制的是自增后值,++在后复制的是自增前值,自增的是解引用的值还是指针指向的地址,看运算顺序(从右至左,*与++同级,且小括号最高级别) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值