指针的算术运算
指针可以进行加减运算: 表示指针指向的内存地址的偏移。
运算单位取决于指针类型: 指针加 n
,实际地址增加 n sizeof(指针所指向的数据类型)
字节。
int arr[5] = {10, 20, 30, 40, 50};int ptr = arr; // ptr 指向 arr[0]ptr = ptr + 1; // ptr 指向 arr[1],地址增加了 1 sizeof(int)ptr += 2; // ptr 指向 arr[3],地址增加了 2 sizeof(int)double dptr;dptr = dptr - 1; // dptr 指向前面的内存地址,偏移 sizeof(double) 字节
指针与整数的加减运算:
ptr + n
: 指针 ptr
向后移动 n
个元素。ptr - n
: 指针 ptr
向前移动 n
个元素。指针的减法运算:
- 两个相同类型的指针相减,结果是它们之间相隔的元素的个数。
int arr[5] = {1, 2, 3, 4, 5};int p1 = &arr[1];int p2 = &arr[4];int diff = p2 - p1int diff = p2 - p1; // diff 的值为 3 (arr[4] 的索引减去 arr[1] 的索引)
注意:指针运算的有效性:
- 确保指向有效的内存地址: 指针运算不能超出数组的边界或访问未分配的内存,否则可能导致程序崩溃或未定义的行为。指针运算通常用于数组: 指针算术运算在遍历数组元素时非常有用。void 指针:
void
指针可以指向任何类型的数据,但不能直接进行指针算术运算,需要先转换为具体的指针类型。指针的比较运算:
- 可以使用关系运算符 (
==
, !=
, >
, <
, >=
, <=
) 比较两个指针的地址。比较相同类型的指针: 比较它们指向的内存地址。比较指向同一数组的指针: 可以判断它们在数组中的相对位置。与空指针比较: 判断指针是否指向有效的内存地址 (ptr == nullptr
或 ptr != nullptr
)。示例:
#include <iostream>int main() { int arr[5] = {10, 20, 30, 40, 50}; int ptr = arr; // 指向 arr[0] std::cout << "Initial pointer: " << ptr << ", value: " << ptr << std::endl; ptr++; // 移动到下一个元素 std::cout << "Pointer after increment: " << ptr << ", value: " << ptr << std::endl; ptr += 2; // 移动两个元素 std::cout << "Pointer after adding 2: " << ptr << ", value: " << ptr << std::endl; int *endPtr = &arr[4]; std::cout << "Distance to the end: " << endPtr - ptr << std::endl; if (ptr < endPtr) { std::cout << "ptr is before endPtr" << std::endl; } return 0;}