c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法
/********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维的长度 * *********************************/ void fun(int a[][3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf("%d ", a[i][j]); printf(" "); } }
/***************************************** *方法2: 指向一个有5个元素一维数组的指针 * *****************************************/ void fun(int(*a)[3], int n, int m) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) printf("%d ", a[i][j]); printf(" "); } }
前面两种方法是必须指明所有维数大小或者省略第一维的。还有一种是网上一直有指针的指针来传递,我用vs2013试了一下,代码如下;
void fun(int **a, int n, int m)
这个直接用fun(a,3,3)是出错的
所以,我另想一个方法,因为数组是顺序存储,所以我们只要传数组的第一个地址过去就可以得到其他,具体看下面代码
#include<stdio.h>
void fun(int *a, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%d ", *(a + i*m + j)); } printf(" "); } } int main() { int a[3][3] = { { 1, 2 }, { 3, 4, 5 }, { 6 } }; printf("%d %d ",a,a[0]); fun(*a,3,3);//fun(a[0][0],3,3) fun(a[0],3,3)这三种都可以 return 0; }