C/C++中以&arr[i]传递子数组是否合法?是否兼容C语言?
数组指针传递问题解答
示例代码
#include <cstdio> int imprimirSubArreglo(int* dirElemInicial, int n) { int numero = 0; for (int i = 0; i < n; ++i) { // cout<<dirElemInicial[i]<<" "; printf("%d ", dirElemInicial[i]); } // cout<<endl; printf("\n"); return numero; } int main() { int arreglo[] = {0, 1, 2, 3, 4}; int retorno = imprimirSubArreglo(&arreglo[2], 3); return 0; }
问题解答
1. 以&arreglo[2]方式传递子数组是否合法?
完全合法。arreglo[2]是原数组的第三个元素,&arreglo[2]获取的是该元素的内存地址。在C/C++标准中,指向数组中某一元素的指针可以被当作"子数组"的起始指针使用,这是语言允许的常规操作,本质是利用数组内存连续存储的特性,通过指针偏移访问后续元素。
2. 是否会出现非法内存访问问题?
当前代码不会出现非法内存访问。原数组arreglo包含5个元素,索引范围是0到4。&arreglo[2]指向索引2的元素,函数中循环3次,访问的是dirElemInicial[0](对应原数组索引2)、dirElemInicial[1](索引3)、dirElemInicial[2](索引4),这三个都是原数组的合法元素,没有越界。只有当传递的n值过大,导致指针偏移超出原数组内存范围时,才会触发非法内存访问。
3. 该代码能否在C语言中运行?
可以,但需要做少量适配修改:
- C语言使用
<stdio.h>头文件替代C++的<cstdio>; - 若遵循C89标准,不能在
for循环内声明变量i,需要将i的声明移到函数开头。
适配后的C语言代码(兼容C89及以上标准):
#include <stdio.h> int imprimirSubArreglo(int* dirElemInicial, int n) { int numero = 0; int i; for (i = 0; i < n; ++i) { printf("%d ", dirElemInicial[i]); } printf("\n"); return numero; } int main() { int arreglo[] = {0, 1, 2, 3, 4}; int retorno = imprimirSubArreglo(&arreglo[2], 3); return 0; }
如果使用C99及以后的标准,仅需替换头文件即可,for循环内声明变量的写法是允许的。
内容的提问来源于stack exchange,提问作者Cebo
相关产品推荐
相关产品推荐

