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

相关推荐
IT_陈寒12 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
kyriewen13 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
文心快码BaiduComate13 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
光辉GuangHui13 小时前
Agent Skill 也需要测试:如何搭建 Skill 评估框架
前端·后端·llm
我是谁的程序员13 小时前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
后端·ios
irving同学4623813 小时前
Node 后端实战:JWT 认证与生产级错误处理
前端·后端
Master_Azur14 小时前
单元测试——Junit单元测试框架
后端
用户83562907805114 小时前
使用 Python 进行 Word 邮件合并
后端
用户83562907805114 小时前
Python 操作 PowerPoint OLE 对象
后端·python
hxttd15 小时前
规则引擎-资源篇
后端