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

如何实现接收数组指针地址的函数遍历数组?附代码示例

如何在接收int**参数的函数中遍历数组

嘿,我来帮你理清楚这个问题~ 你遇到的核心是搞懂指针的层级关系,以及数组和指针之间的隐式转换逻辑,接下来我一步步给你拆解,再给你实际的代码实现。

核心逻辑梳理

首先你要明确:当你调用example(&arr, n)时,这里的&arr是整个数组的地址,它的原生类型是int (*)[n](指向长度为n的int数组的指针),而你的函数参数是int**(指向int指针的指针)——这俩其实类型不匹配,但编译器会做隐式转换,这也是为什么你能用*arr拿到数组首元素的地址,**arr拿到首元素的值。

本质上,*arr相当于把数组指针转换成了指向首元素的int*指针,有了这个首元素指针,遍历数组就和普通的指针遍历数组一样了。

可行的函数实现

直接上代码,你可以用两种方式访问后续元素,效果完全等价:

#include <stdio.h>

int example(int** arr, int n) {
    // 先拿到指向数组首元素的指针
    int* array_start = *arr;
    int total = 0;

    for (int i = 0; i < n; i++) {
        // 方式1:用下标语法(更直观)
        int current_val1 = array_start[i];
        // 方式2:用指针偏移(本质和下标一致)
        int current_val2 = *(array_start + i);

        printf("第%d个元素:%d\n", i, current_val1);
        total += current_val1;
    }

    return total;
}

// 调用示例
int main() {
    int arr[] = {1, 3, 5, 7, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 注意:这里因为类型不匹配,编译器会报警告,可以用强制转换消除
    int k = example((int**)&arr, n);
    printf("数组元素总和:%d\n", k);

    return 0;
}

更规范的写法(避免类型警告)

刚才的写法有类型不匹配的警告,如果你不需要修改数组的指向(数组名本身是常量指针,也没法修改指向),其实完全没必要传递数组的地址,直接传数组名(会隐式转换成首元素指针)就行,函数参数用int*或者int arr[](两者等价):

// 更规范的函数定义
int example(int* arr, int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        printf("第%d个元素:%d\n", i, arr[i]);
        total += arr[i];
    }
    return total;
}

// 调用时直接传数组名
int k = example(arr, n);

如果你的场景确实需要传递数组的地址(比如某些特殊需求),那应该把函数参数改成指向数组的指针,这样就没有类型问题了:

// 参数为指向长度为5的int数组的指针(如果数组长度不固定,可以用VLA)
int example(int (*arr)[5], int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        // 用(*arr)[i]访问元素
        printf("第%d个元素:%d\n", i, (*arr)[i]);
        total += (*arr)[i];
    }
    return total;
}

// 调用时直接传&arr
int k = example(&arr, n);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:14:07