*p++,(*p)++,*++p,++*p辨析

本文详细解析了C语言中指针与自增自减运算符结合使用时的行为差异,通过具体实例展示了不同组合下(如*px++与(*px)++)的数据变化过程及内存地址变动情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)px挨着自增自减

形式:

*px++或*(px++)

*++px或*(++px)

 

-前自增自减和前自增自减的优先级都比*的优先级高:就是说*px++其实是*(px++),而不是(*px)++。如例1

-*px++的结果是一个值,这个操作可以像例1写在外面,也可以像例2写在里面。

-前后自增自减还是有效果的,如例2的指针后移就在其他操作完成后执行,即*p_x++是先得到p_x所指向内存空间的值,然后指针++

 

 

【例子1】:

double x[3] = {1,5,9};

double *px = x;

printf("*px=%lf\t px=%p\n", *px,px);

*px++;

printf("*px=%lf\t px=%p\n", *px, px);

 

结果是:

*px=1.000000     px=008FF844

*px=5.000000     px=008FF84C

 

【例子2】:

printf("*px=%lf\t px=%p\n", *px,px);

 

printf("*px=%lf\t px=%p\n", *(px++), px);

 

结果是:

*px=1.000000     px=010FFC80

*px=1.000000     px=010FFC88

 

(2)px挨着*

形式:

(*px)++

++(*px)或++*px

 

-先取指针指向的值,然后指针指向的值加1.

-*px++的结果是一个值,这个操作可以像例3写在外面,也可以像例4写在里面。

-前后自增自减还是有效果的,如例4

 

 

【例子3】:

printf("*px=%lf\t px=%p\n", *px,px);

(*px)++;

printf("*px=%lf\t px=%p\n", *px, px);

 

结果是:

*px=1.000000     px=00EFF8CC

*px=2.000000     px=00EFF8CC

 

【例4】:

printf("*px=%lf\t px=%p\n", *px,px);

printf("*px=%lf\t px=%p\n", (*px)++, px);

 

结果是:

*px=1.000000     px=0093FD0C

 

*px=1.000000     px=0093FD0C

 

 

 

 

PS:

 

指针大小是4字节,不管什么类型的指针都是4字节。sizeof(px)=4

区分指针指向内容的大小,这个大小与指针指向的类型有关。比如下面的*px++后增加的8个字节就是double类型的原因。double的大小是8个字节(32位操作系统)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值