C++数组与指针中数组和指针的算术运算有什么区别和联系

来源:语言推理作者:北京网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++数组与指针中数组和指针的算术运算有什么区别和联系》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++数组与指针中数组和指针的算术运算有什么区别和联系》有用,将其分享出去将是对创作者最好的鼓励。

在C++里,数组和指针的算术运算是紧密相关的概念,但初学者常常分不清它们的行为。数组名在表达式中通常会转换为指向首元素的指针,而指针支持加减整数、相减等运算,其步长由指向的类型决定。

C++数组与指针中数组和指针的算术运算有什么区别和联系

指针算术的基本规则

指针加上或减去一个整数n时,实际移动的字节数是n乘以sizeof(所指向的类型)。两个同类型指针相减,得到的是它们之间的元素个数,而不是字节差。

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int* p = arr;          // 数组名退化为指针
    p = p + 2;             // 移动2个int,指向arr[2]
    cout << *p << endl;    // 输出3

    int* q = arr + 4;      // 指向arr[4]
    ptrdiff_t diff = q - p; // 同类型指针相减
    cout << diff << endl;  // 输出2,表示相隔2个元素
    return 0;
}

数组下标的本质

表达式arr[i]在编译期通常被解释为*(arr + i)。因为arr退化为指针,所以下标运算其实就是指针算术。同样,p[i]等价于*(p + i)。

  • arr + i 得到第i个元素的地址
  • *(arr + i) 解引用得到元素值
  • 数组名不能进行自增等修改,因为它不是可修改的左值

数组名与指针变量的差异

虽然数组名常表现为指针,但它和指针变量不同。用sizeof运算时,数组名得到整个数组大小,指针变量只得到指针本身大小。

#include <iostream>
using namespace std;

int main() {
    int arr[5];
    int* p = arr;
    cout << sizeof(arr) << endl; // 输出20(假设int为4字节)
    cout << sizeof(p) << endl;  // 输出8(64位平台指针大小)
    return 0;
}

注意事项

进行指针算术时必须保证结果仍指向同一数组范围内或尾后位置,否则行为未定义。遍历数组推荐用标准库容器和迭代器,减少手动运算错误。

指针算术是C++贴近硬件效率的体现,但也需要开发者自己保证边界安全。

简单遍历示例

#include <iostream>
using namespace std;

int main() {
    double data[3] = {1.1, 2.2, 3.3};
    for (double* it = data; it != data + 3; ++it) {
        cout << *it << " "; // 利用指针自增遍历
    }
    return 0;
}

掌握数组与指针算术的联系,能帮助你理解C++底层内存布局,也能在阅读老旧代码或系统级程序时更加从容。

C++数组指针算术修改时间:2026-07-26 10:57:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。