You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:32:38