C++——指针的运算


指针的算术运算

  • 指针可以进行加减运算: 表示指针指向的内存地址的偏移。

  • 运算单位取决于指针类型 : 指针加 n,实际地址增加 n * sizeof(指针所指向的数据类型) 字节。

    cpp 复制代码
    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 个元素。
  • 指针的减法运算:

    • 两个相同类型的指针相减,结果是它们之间相隔的元素的个数
    cpp 复制代码
    int 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 == nullptrptr != 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;
    }

相关推荐
源代码•宸12 分钟前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
Chan1633 分钟前
场景题:CPU 100% 问题怎么排查?
java·数据库·redis·后端·spring
我是谁的程序员1 小时前
iOS 文件管理,在不越狱的前提下管理 iPhone / iPad 文件
后端
v***59831 小时前
springBoot连接远程Redis连接失败(已解决)
spring boot·redis·后端
桦说编程1 小时前
滑动窗口限流器的演进之路:从调度器实现到 Packed CAS
java·后端·性能优化
狗头大军之江苏分军1 小时前
告别旧生态:Ant Design 6 不再支持 IE 与现代前端趋势解读
前端·javascript·后端
初次攀爬者2 小时前
SpringBoot 整合 JWT + Redis 实现登录鉴权
java·redis·后端
壹米饭2 小时前
MYSQL进阶:删除视图时视图被lock解决方案
后端·mysql
CV工程师的自我修养2 小时前
还不知道线程池如何使用?看懂这篇就可以创建合理稳定的线程池
后端·架构