C++中的指针操作:++Ptr、++Ptr、Ptr++、和(Ptr)++

本文详细解释了C++中四种指针操作(++Ptr,*++Ptr,ptr++,(*Ptr)++)的区别,涉及地址计算、数据改变以及运算符优先级,帮助新手理解指针加减运算的含义和实际效果。

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

*++Ptr、++*Ptr、*Ptr++、和(*Ptr)++


刚刚接触C++或者C的新手们对这四种操作会比较迷糊,不能理解

虽然我也学过了一段时间,但是回头看的时候有时候也会犯错搞迷糊

今天把四种不同的指针操作都讲明白清楚

在这里可以提前去看一下前置++和后置++的区别,这两者的返回值是不同的

比如说**++Num**,这个就等于

Num = Num +1 ;

return Num;

如果是Num++,这个就等于

Num = Num +1;

Temp = Num;

return Temp;

大概的意思是这样子的哈,如果表述不清楚或者有逻辑上的错误,还请同学们指出。

1. *++Ptr

很明显可以看出来,这里明显是先对Ptr先进行地址的++操作,然后再取这块地址上的数据

但是这里并不是地址+1,在32位的情况下,移动一个字节,就是+4

如果是在64位的情况下,那么就是移动两个字节,就是+8

int main() {
	
	int a[]{ 1001,2001,3001,4001 };
	int* ptr = &a[0];

	std::cout << ptr << std::endl;
	std::cout << *++ptr << std::endl;
	std::cout << ptr << std::endl;
	return 0;
}

在这里插入图片描述

*++Ptr = *(++Ptr)

2. ++*Ptr

其实这个也非常好理解,就是先对Ptr进行解引用,然后对地址上保存的数进行++操作


int main() {
	
	int a[]{ 1001,2001,3001,4001 };
	int* ptr = &a[0];

	std::cout << ptr << std::endl;
	std::cout << ++ *ptr << std::endl;
	std::cout << ptr << std::endl;

	return 0;
}

在这里插入图片描述

可以看出来结果吧,没有骗你们

内存地址的结果没有改变,数据改变了

3. *Ptr++

在上面讲了前置++和后置++的区别,在这里会用得上哈

我个人感觉理解这四种不同的++,要先理解前++和后++的区别后再来看这个会比较好

在这里的话我们输出结果看一下哈

int main(){
	std::cout << ptr << std::endl;
	//std::cout <<*(ptr++) << std::endl;
	std::cout << *ptr++ << std::endl;
	std::cout << ptr << std::endl;
	std::cout << *ptr << std::endl;
	return 0;
}

在这里插入图片描述

各位可以看到吧

在这里ptr先++,他先和++运算符结合

但是呢,返回给*这个操作符的对象是temp也就是之前的ptr,所以第一次输出的结果是之前的地址单元中的数据1001

ptr已经改变了,所以再一次输出ptr的话,地址改变了,解引用的值也该改变了

我不知道自己说的清楚不清楚哈,大概就是这个意思了

然后可以把上面代码注释的那行取消一下,执行的结果也是这个样子的

在这里插入图片描述

没有骗你们吧

4.(*Ptr)++

这个就好理解了吧!理解了上面那个,这个应该问题也不大了

先对Ptr进行解引用,然后对数进行后++的操作

在这里我也写一段代码,大家看一下

其实我感觉只要理解了上面那个例子,这个应该不是什么大问题的

如果大家在写代码的时候会对操作符运算优先级有疑惑的话,我个人感觉多用()会提高代码的可读性,自己也好判断

在这里插入图片描述

看吧,地址是没有改变的,数值改变了

最后整个代码大家看一下,自己再整理整理!

自己再分析分析一下结果,如果可以分析出来呢,你明白了这四种操作的区别了!


int main() {
	
	int a[]{ 1001,2001,3001,4001 };
	int* ptr = &a[0];

	std::cout << ptr << std::endl;
	std::cout << *++ptr << std::endl;
	std::cout << ptr << std::endl;

	std::cout << std::endl;

	std::cout << ptr << std::endl;
	std::cout << ++ *ptr << std::endl;
	std::cout << ptr << std::endl;

	std::cout << std::endl;

	std::cout << ptr << std::endl;
	//std::cout <<*(ptr++) << std::endl;
	std::cout << *ptr++ << std::endl;
	std::cout << ptr << std::endl;
	std::cout << *ptr << std::endl;

	std::cout << std::endl;

	std::cout << ptr << std::endl;
	std::cout << (*ptr)++ << std::endl;
	std::cout << ptr << std::endl;
	std::cout << *ptr << std::endl;
	return 0;
}

r << std::endl;

std::cout << std::endl;

std::cout << ptr << std::endl;
std::cout << (*ptr)++ << std::endl;
std::cout << ptr << std::endl;
std::cout << *ptr << std::endl;
return 0;

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/78197d35e2904e8194cc7dc72242166e.png)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值