指针的算术运算
-
指针可以进行加减运算: 表示指针指向的内存地址的偏移。
-
运算单位取决于指针类型 : 指针加
n
,实际地址增加n * sizeof(指针所指向的数据类型)
字节。cppint 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
个元素。
-
指针的减法运算:
- 两个相同类型的指针相减,结果是它们之间相隔的元素的个数。
cppint arr[5] = {1, 2, 3, 4, 5}; int *p1 = &arr[1]; int *p2 = &arr[4]; int diff = p2 - p1 int diff = p2 - p1; // diff 的值为 3 (arr[4] 的索引减去 arr[1] 的索引)
-
注意:指针运算的有效性:
- 确保指向有效的内存地址: 指针运算不能超出数组的边界或访问未分配的内存,否则可能导致程序崩溃或未定义的行为。
- 指针运算通常用于数组: 指针算术运算在遍历数组元素时非常有用。
- void 指针 :
void*
指针可以指向任何类型的数据,但不能直接进行指针算术运算,需要先转换为具体的指针类型。
-
指针的比较运算:
- 可以使用关系运算符 (
==
,!=
,>
,<
,>=
,<=
) 比较两个指针的地址。 - 比较相同类型的指针: 比较它们指向的内存地址。
- 比较指向同一数组的指针: 可以判断它们在数组中的相对位置。
- 与空指针比较 : 判断指针是否指向有效的内存地址 (
ptr == nullptr
或ptr != nullptr
)。
- 可以使用关系运算符 (
-
示例:
cpp#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; }