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

相关推荐
用户83562907805118 分钟前
如何使用 Python 将 PowerPoint 转换为 PDF 文档
后端·python
倔强的石头_18 分钟前
从 8 行报错到一条故障链:我用蓝耘 MaaS 做了一个 AI 日志分析助手
后端
敲个大西瓜22 分钟前
Spring Could Alibaba 核心面试题
java·后端·spring
用户83562907805129 分钟前
如何使用 Python 为 PowerPoint 幻灯片添加切换效果
后端·python
四千岁37 分钟前
RAG系统中的分块
前端·javascript·后端
Young_Gnay39 分钟前
.NET 之 WebApi学习笔记 (持续更新)
后端·c#
程序员cxuan1 小时前
Claude Code :如何最大化你的 Session 价值
人工智能·后端·程序员
雨落倾城夏未凉2 小时前
halcon核心-C# 联合编程(十一)
后端
元界metalite3 小时前
SpringBoot整合Druid-连接池参数为什么不能照抄
后端