如何将数组指针传递给函数?数组传参与指针使用疑问解析
数组传参问题与指针使用纠正
问题1:数组传参是否默认传递地址?
是的,在C语言中,数组作为函数参数时会被隐式转换为指向数组首元素的指针。你在switchnum里修改arraytemp的元素,本质上是通过指针直接操作主函数中arraytemp数组的内存空间,因此主函数里的数组会同步被修改,这就是你能在主函数中看到修改后结果的原因。
问题2:switchnum2的错误原因与正确写法
你的switchnum2函数参数int *arraytemp2[6]的含义是「一个包含6个int类型指针的数组」,但你传入的是普通int数组arraytemp2[6],类型完全不匹配。后续你把int值直接赋值给指针变量(arraytemp2[j] = array2[laenge2-1-j];),相当于把整数当成内存地址存储,访问这类非法地址会直接触发内存错误(比如栈溢出)。
正确的数组指针传递方式
有两种常用的合法写法,本质等价:
- 保持数组形式声明参数:
int arraytemp2[]或int arraytemp2[6],编译器会自动将其解析为int *arraytemp2。 - 显式声明为指向
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
相关产品推荐
相关产品推荐

