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;
    }

相关推荐
摇滚侠1 天前
Spring Boot 3零基础教程,WEB 开发 静态资源默认配置 笔记27
spring boot·笔记·后端
天若有情6731 天前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
一只叫煤球的猫1 天前
建了索引还是慢?索引失效原因有哪些?这10个坑你踩了几个
后端·mysql·性能优化
magic334165631 天前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
开心-开心急了1 天前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
掘金码甲哥1 天前
调试grpc的哼哈二将,你值得拥有
后端
小学鸡!1 天前
Spring Boot实现日志链路追踪
java·spring boot·后端
用户21411832636021 天前
OpenSpec 实战:用规范驱动开发破解 AI 编程协作难题
后端
Olrookie1 天前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
LucianaiB1 天前
招聘可以AI面试,那么我制作了一个AI面试教练不过分吧
后端