c++ 指针的算术运算

在 C++ 中,对指针进行算术运算是一种常见的操作,这样可以在内存中移动指针来访问数组或其他连续分配的数据结构。

指针的算术运算允许对指针进行递增 (increment)、递减 (decrement)、加法和减法运算。这些操作通常在指向数组的指针上执行,因为它们依赖于指针指向一块连续的内存区域。

递增(++)和递减(–)

值会增加或减小所指向类型的大小

对指针递增 (ptr++ 或 ++ptr) 会使指针向前移动到它所指向类型的下一个对象。
对指针递减 (ptr-- 或 --ptr) 会使指针向后移动到它所指向类型的上一个对象。

加法 + 和减法 -

可以将一个整数值加上或从指针中减去,指针会向前或向后移动对应的元素个数。移动的实际字节数等于整数值乘以所指向对象的大小。

指针与指针的减法

可以通过两个相同类型的指针间进行减法来得到它们之间的元素个数差距。结果是一个 ptrdiff_t 类型的值,表示两个指针之间存在的元素个数。

指针与整数的乘法和除法

C++ 标准不允许对指针执行乘法和除法操作。如果需要在内存中按更大的步幅移动指针,你必须手动计算相应的偏移量。
void func(){
	int arr[] = {10, 20, 30, 40, 50};
	int* p = arr; // 指向数组的第一个元素
	p++;        // 现在 p 指向 arr[1]
	int val = *p; // val 的值为 20
	p += 2;     // 现在 p 指向 arr[3]
	val = *p;   // val 的值为 40
	p--;        // 现在 p 指向 arr[2]
	val = *p;   // val 的值为 30
	int difference = &arr[4] - p; // difference 的值为 2
}
void func1()//递增 ++ 和递减 --
{
	int arr[] = {10, 20, 30};
	int* p = arr;  // p 指向数组的第一个元素,arr[0]
	p++;            // 现在 p 指向 arr[1]
	p--;            // 现在 p 又指向 arr[0]
}
void fun2()//加法 + 和减法 - 
{
	int arr[] = {10, 20, 30, 40, 50};
	int* p = arr;   // p 指向 arr[0]
	p = p + 2;      // 现在 p 指向 arr[2]
	p = p - 1;      // 现在 p 指向 arr[1]
}
void func3()//指针与指针的减法
{
	int arr[] = {10, 20, 30, 40, 50};
	int* start = arr;      // 指向 arr[0]
	int* end = arr + 5;    // 指向 arr[5](注意:这是数组的尾后地址,不能被解引用)
	ptrdiff_t diff = end - start; // diff 是 5
}

注意事项

对非数组指针进行算术运算是合法的,但如果结果指针越界,即它不再指向同一数组的元素,那么对结果指针解引用或进行其他算术运算就会产生未定义的行为。
对于 void* 指针,由于 void 类型的大小未知,常规的指针算术是不允许的。
尽管指针之间可以做减法运算,但指针不能相加。

总之,指针算术是 C++ 中处理数组和迭代内存块的强大特性。然而,使用它们要非常小心,以避免错误的访问或造成内存损坏。在现代 C++ 开发中,建议尽量使用迭代器(iterator)或范围循环(range-based for loop)来代替指针算术,以提高代码的安全性和可读性。

正确使用指针算术是掌握 C++ 动态数据结构操作的关键。更安全的选择是使用容器类(如 std::vector 或 std::array)以及迭代器,它们隐藏了指针算术的细节,同时提供了类似的功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘气の小狼人¹º²⁴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值