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

C语言中如何用指针操作多维数组?传递后半段数组的方法

传递多维数组后半段的可行方法

你的推测是对的:C语言中多维数组确实是连续存储的,4×4的二维数组和包含16个元素的一维数组内存布局完全一致。你之前的写法错误是因为函数声明的语法完全不合法,void foo(array+8)根本不符合C语言的函数定义规则,这才导致了运行错误。下面是两种可行的传递方式:

方式一:当作一维数组传递

如果不需要保留二维结构,可以把后半段8个元素当作普通一维数组传递,函数接收int*类型的指针,同时传递元素个数:

#include <stdio.h>

void foo(int *arr, int len) {
    for (int i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int array[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    // 三种等价的调用方式
    foo(&array[2][0], 8);       // 直接取第三行第一个元素的地址
    foo(*(array + 2), 8);       // array+2指向第三行,解引用后转为该行首元素指针
    foo((int*)array + 8, 8);    // 强制转为int指针,偏移8个元素
    return 0;
}

方式二:当作二维数组(2×4)传递

如果需要保留二维结构(即按行访问),函数需要声明为接收指向4个int的数组的指针,同时传递行数:

#include <stdio.h>

void foo(int (*arr)[4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int array[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    foo(array + 2, 2); // array+2指向第三行,传递行数2
    return 0;
}

这里array的类型是int (*)[4](指向含4个int的数组的指针),array+2会偏移2个“4int数组”的长度,正好指向原数组的第三行起始位置,函数内部可以用arr[i][j]直接访问二维元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:53:13