C语言指针杂谈

有这样一段C语言:

#include <stdio.h>

int main(void){
	int x = 3; 
	int *p = &x ;
	printf("*p = %d\n",*p);
	printf("(*p)++ = %d\n",(*p)++);
	printf("*(p++) = %d\n",*(p++));
	printf("*p++ = %d\n",*p++);

	return 0 ;
}

输出结果:

*p = 3
(*p)++ = 3
*(p++) = 4
*p++ = 1703808

下面来分析一下出现这个结果的原因:

*p = 3 , 这个输出很正常,因为p指向x,x的值为3,所以解引用*p的值为3

(*p)++ = 3 , 这里先输出*p的值, 又因为*p = x ;所以相当于x++操作, 所以第二句执行完后x的值变为4(这里的++操作已经是针对x了,不是针对指针p的++操作)

*(p++) = 4 ,这里先执行*p,再执行p++操作,有人会问,p++操作明明是用括号括起来了,怎么不是先执行p++操作, 这里我猜测是由于++的前置和后置的区别引起的, 括号对他们不管用,这里我如果将*(p++) 改成*(++p), 输出结果是1703808(十进制的地址值), 说明这里*(++p)确实先执行了指针的++操作, 导致输出操作后执行,而p的后一个地址的值是不确定的

*p++ = 1703808, 这里由于第三句输出完*p后,指针地址++操作,p已经指向了原来地址的后一个地址,而后一个地址的值不确定,所以这里的操作是先输出后一个地址的值,然后后一个地址再自增


看下面几副执行图:

这里表示++操作是针对指针的


这里表示++操作是针对*p也就是x的


从上面两幅图的执行结果可以看出++p和p++操作是不同的执行顺序, 前置++p先执行p的自增操作,后置p++,后执行p++操作



这里我还有一点不太明白, 就是p自增后, 再输出*p为什么是1703808, 希望看到这篇文章的同学可以为我解惑.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值