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
相关产品推荐
相关产品推荐

