C++中arr+1获取子数组的内存行为是拷贝还是指针偏移?
问题结论
arr+1仅会对指针做算术偏移,不会创建子数组拷贝,也不会产生额外的数组内存占用。
底层原理说明
- 首先纠正一个常见误解:你代码中函数参数写的
int arr[]并不是数组引用,C/C++中数组作为函数参数传递时会自动退化为指向数组首元素的指针,也就是说这个参数本质是int* arr,函数拿到的只是原数组首元素的内存地址,没有传递整个数组的内容。 - 指针算术的规则:对于
T*类型的指针,执行p + n操作时,实际计算的内存地址为(uintptr_t)p + n * sizeof(T)。你的案例中T是int,因此arr + 1就是把原指针的地址向后偏移1个int的大小(多数平台为4字节),直接指向原数组的第二个元素,整个过程只做了一次基础的加法运算,没有任何内存分配、数组拷贝的操作。 - 你老师的写法是C/C++中表示数组区间的常规方案:用「起始指针+长度」的组合标识一段连续的内存区间,所有操作都直接在原数组的内存上执行,递归过程中只会产生指针参数、长度参数和栈帧的常规开销,和数组本身的大小无关。
你可以做个简单测试:在函数中修改arr[0]的值,外部原数组的对应位置值会同步变更,也可以验证没有发生数组拷贝。
内容的提问来源于stack exchange,提问作者Jeremy Fisher
相关产品推荐
相关产品推荐

