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

相关推荐
码农阿豪9 分钟前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
威迪斯特17 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
程序员良许1 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解1 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记2 小时前
工商银行今年的年终奖。。
后端
大黄评测2 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端
Java编程爱好者2 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?
后端
Java编程爱好者2 小时前
线程池用完不Shutdown,CPU和内存都快哭了
后端