类数组或者是函数的参数转为数组

本文介绍了一种将类数组对象或函数参数列表转换为标准 JavaScript 数组的方法。通过使用 `Array.prototype.slice.call` 或循环遍历的方式实现这一转换,这对于后续的数据处理非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 将类数组或者函数中的参数转化为数组
        function toArray(arg){
            try{
                return Array.prototype.slice.call(arg,0);
            }catch{
                var arr = [];
                for(var i = 0 ; i < arg.length ; i ++){
                    arr[i] = arg[i];
                }
                return arr;
            }
        }

参考文档

 

<think>在C语言中,函数参数传递数组通常涉及传递数组的指针。由于数组名在大多数情况下会被解释为指向其首元素的指针,因此函数可以通过指针来访问和修改数组元素。以下是几种常见的方法: 1. **使用指针形式参数** 函数参数可以声明为指针类型,接收数组的首地址。 示例: ```c void printArray(int *arr, int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } ``` 2. **使用数组形式参数(编译器仍视为指针)** 虽然语法上看起来像数组,但实际传递的是指针。 示例: ```c void printArray(int arr[], int size) { // arr[] 等价于 *arr for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } ``` 3. **传递多维数组** 多维数组需要指定除第一维外的所有维度大小(编译器需知道步长)。 示例(二维数组): ```c void printMatrix(int mat[][3], int rows) { // 第二维大小必须固定 for (int i = 0; i < rows; i++) { for (int j = 0; j < 3; j++) { printf("%d ", mat[i][j]); } } } ``` ### 关键注意事项: - **数组长度需额外传递**:C语言不会在数组参数中保存长度信息,必须通过额外参数(如 `size`)传递。 - **避免返回局部数组指针**:函数内局部数组函数结束后失效,返回其指针会导致未定义行为(正确方法见引用[1][2])。 - **修改原数组**:通过指针参数可直接修改原数组内容(如引用[2]示例)。 ### 完整示例:修改数组元素 ```c #include <stdio.h> // 函数:将数组所有元素乘以2 void doubleArray(int *arr, int size) { for (int i = 0; i < size; i++) { arr[i] *= 2; // 直接修改原数组 } } int main() { int myArr[] = {1, 2, 3, 4, 5}; int len = sizeof(myArr) / sizeof(myArr[0]); doubleArray(myArr, len); // 传递数组名(即首地址) // 打印修改后的数组 for (int i = 0; i < len; i++) { printf("%d ", myArr[i]); // 输出:2 4 6 8 10 } return 0; } ``` ### 引用说明: - 引用[2]展示了通过参数修改数组的典型方法(非返回数组)[^2]。 - 引用[4]警示了返回局部数组指针的危险性[^4]。 §§相关问题§§ 1. C语言中如何避免函数返回局部数组指针导致的错误? 2. 传递多维数组时为什么必须指定除第一维外的维度大小? 3. 如何通过结构体封装数组实现安全返回?</think>### C语言函数数组参数的用法详解 在C语言中,向函数传递数组参数时,**实际传递的是数组首元素的地址**(指针),而非整个数组的拷贝。以下是具体用法和注意事项: #### 1. **基本声明方式** ```c // 方式1:显式指针形式(最常用) void processArray(int *arr, int size) { for(int i=0; i<size; i++) { arr[i] *= 2; // 直接修改原数组 } } // 方式2:数组形式(编译器自动转为指针) void printArray(int arr[], int size) { for(int i=0; i<size; i++) { printf("%d ", arr[i]); } } ``` > 📌 两种形式完全等价,`int arr[]` 会被编译器解释为 `int *arr`[^2]。 #### 2. **多维数组传递** ```c // 必须指定第二维大小(编译器需计算步长) void fillMatrix(int mat[][3], int rows) { for(int i=0; i<rows; i++) { for(int j=0; j<3; j++) { mat[i][j] = i+j; } } } ``` #### 3. **关键注意事项** - **必须传递数组大小**: 函数内无法通过 `sizeof(arr)` 获取数组长度(`sizeof(arr)` 返回指针大小),需额外传递 `size` 参数。 ```c int main() { int nums[5] = {1,2,3,4,5}; processArray(nums, 5); // 正确:数组名即首地址 } ``` - **直接修改原数组**: 通过指针操作会修改原始数组(无拷贝机制),如: ```c void zeroArray(int *arr, int size) { for(int i=0; i<size; i++) arr[i] = 0; // 原数组被清零 } ``` - **禁止返回局部数组指针**: 函数内局部数组在栈上分配,函数返回后内存失效(导致未定义行为): ```c // 错误示例! int* createArray() { int arr[3] = {1,2,3}; // 局部数组 return arr; // 危险!返回后内存被释放 } ``` 正确方法:使用静态数组或动态内存(见引用[1][^1])。 #### 4. **完整示例:数组求和函数** ```c #include <stdio.h> // 函数声明 int arraySum(int *arr, int size); int main() { int values[] = {10, 20, 30, 40}; int len = sizeof(values) / sizeof(values[0]); // 计算数组长度 int sum = arraySum(values, len); // 传递数组地址和长度 printf("数组总和: %d", sum); // 输出:100 return 0; } // 函数定义 int arraySum(int *arr, int size) { int total = 0; for(int i=0; i<size; i++) { total += arr[i]; // 通过指针访问数组元素 } return total; } ``` ### 引用说明: - 引用[2]验证了数组参数实际是指针传递的机制[^2]。 - 引用[4]警示了返回局部数组指针的危险性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值