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

如何将数组指针传递给函数?数组传参与指针使用疑问解析

数组传参问题与指针使用纠正

问题1:数组传参是否默认传递地址?

是的,在C语言中,数组作为函数参数时会被隐式转换为指向数组首元素的指针。你在switchnum里修改arraytemp的元素,本质上是通过指针直接操作主函数中arraytemp数组的内存空间,因此主函数里的数组会同步被修改,这就是你能在主函数中看到修改后结果的原因。

问题2:switchnum2的错误原因与正确写法

你的switchnum2函数参数int *arraytemp2[6]的含义是「一个包含6个int类型指针的数组」,但你传入的是普通int数组arraytemp2[6],类型完全不匹配。后续你把int值直接赋值给指针变量(arraytemp2[j] = array2[laenge2-1-j];),相当于把整数当成内存地址存储,访问这类非法地址会直接触发内存错误(比如栈溢出)。

正确的数组指针传递方式

有两种常用的合法写法,本质等价:

  1. 保持数组形式声明参数:int arraytemp2[] 或 int arraytemp2[6],编译器会自动将其解析为int *arraytemp2。
  2. 显式声明为指向int的指针:int *arraytemp2,使用下标arraytemp2[j]访问元素的逻辑和数组完全一致。

修正后的代码

#include <stdio.h>

void switchnum (int arraytemp[6], int array[], int laenge) {
    printf("\n\nAfter (in function 1):\n");
    for(int i = 0 ; i<laenge ; i++) {
        arraytemp[i] = array[laenge-1-i];
        printf("%d ", arraytemp[i]);
    }
}

// 修正后的switchnum2:用指针形式接收数组(和数组声明等价)
void switchnum2 (int *arraytemp2, int array2[], int laenge2) {
    printf("\nAfter (in function2):\n");
    for(int j = 0 ; j<laenge2 ; j++) {
        arraytemp2[j] = array2[laenge2-1-j];
        printf("%d ", arraytemp2[j]);
    }
}

int main() {
    int array[] = {4,8,1,3,0,9};
    int arraytemp[6];
    printf("Before (main):\n");
    for(int i = 0 ; i<6 ; i++) {
        printf("%d ", array[i]);
    }  
    
    switchnum(arraytemp, array, 6);

    printf("\nAfter (in main):\n");
    for(int i = 0 ; i<6 ; i++) {
        printf("%d ", arraytemp[i]);
    }   
    
    
    int array2[] = {4,8,1,3,0,9};
    int arraytemp2[6];
    
    switchnum2(arraytemp2, array2, 6);    
    
    return 0;
}

关键总结

  • 数组作为函数参数时,自动退化为指向首元素的指针,因此函数内对参数数组的修改会直接作用于原数组。
  • 区分int *arr[](指针数组)和int *arr(指向int的指针),前者是存储指针的数组,后者才是数组传参的正确指针形式。
  • 普通数组传参用int arr[]或int *arr即可,两者在编译层面完全等价。

内容的提问来源于stack exchange,提问作者Valen7ino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:45:36