【C语言笔记】q = p++的结果如何?*p++ = 3的结果又如何?

一、定义两个指针变量p和q,q=p++的结果会如何?是p先做自增,再将值赋给q,还是p先将值赋给q,然后再自增?

为了验证这个结果,我们可以写一个简单程序:

#include <stdio.h>

int main() {
	int a[] = {6, 8, 10};
	int *p = a;
	int *q;

	printf("p=%p *p=%d\n", p, *p);
	q = p++;
	printf("p=%p *p=%d\n q=%p *q=%d\n", p, *p, q, *q);
	return 0;
}

先定义一个一维数组a和两个指针变量p和q,并将a的首地址赋给p,先输出p和*p的值,也就是数组a的首地址,接着做q=p++,再输出p、*p和q、*q的值,与之前p和*p的值做比较。结果如下:

p=0xbfa4f1c4 *p=6
p=0xbfa4f1c8 *p=8
q=0xbfa4f1c4 *q=6

从运行结果可以看到,p的值增加了4,刚好是int型变量的长度,也就是指针p在数组中所值的对象从第一个数6变成了第二个数8,而q的值等于原来p的值,指向的也是原来p所指向的值6。

因此,q=p++这个表达式中,是p的值先赋给了q,然后再将p++的值赋给p。其实++后置运算符起的作用,先进行赋值运算,再进行自增运算。

二、*p++ = 3的结果又如何?这个3到底是赋给了谁?

还是通过一个简单的程序来解决这个问题:

#include <stdio.h>

int main() {
	int a[] = {6, 8, 10};
	int *p = a;

	printf("before p=%p\n", p);
	*p++ = 3;
	printf("after p=%p\n", p);
	printf("after:%d %d %d\n", a[0], a[1], a[2]);
	return 0;
}

在这个程序中,定义了一个数组a和一个指针变量p,并将a的首地址赋给了指针p,第一个printf函数输出的就是数组a的首地址。

进行*p++=3运算之后,输出的结果如下:

before p=0xbfdcada4
after p=0xbfdcada8
after:3 8 10

经过运算之后,p的值增加了4,就是一个int型数的长度,a[0]的值变成了3,由此可知,是先将3这个值赋给了p指向的a[0],然后进行p++,并赋给p,使p的指向向前一个数据,变成a[1]。这个例子中,还是++后置运算符的作用,先进行了赋值运算,在进行自增运算。

指针的自增和自减运算有很多值得注意的地方,千万要谨慎,以免犯错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个嵌入式新手的成长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值