C函数传递二维数组

来源:互联网 发布:多张同样表格数据汇总 编辑:程序博客网 时间:2024/05/13 19:24

方法一:形参为int [ ][ N ]类型,实参也为int [ ][ N ]类型

#include <stdio.h>#include <stdlib.h>#define M 3#define N 4 int get(int a[][N], int i, int j)//一定要给出第二维的维数,否则编译器无法寻址{ return a[i][j]; } int main() {    int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};    int v;     v = get(a, 2, 1);     printf("a[2][1] == %d\n", v );     return 0; }
方法二:形参为int *类型,实参为int [ ][ N ]类型

#include <stdio.h>#include <stdlib.h>#define M 3#define N 4 int get(int* a, int i, int j){ return *(a+i*N+j);  //注意:此处不能再使用a[i][j];} int main() {    int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};    int v;     v = get( (int *)a, 2, 1); //需要将int [][N]类型的a强制类型转换为int *,否则编译报错    printf("a[2][1] == %d\n", v );     return 0; }
方法三:形参为int **类型,实参为int [ ][ N ]类型

#include <stdio.h>#include <stdlib.h>#define M 3#define N 4 int get(int** a, int i, int j){ return *((int *)a+i*N+j); //需要将int **强制类型转化为int * } int main() {    int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};    int v;     v = get( (int **)a, 2, 1); //需要将int [][N]类型的a强制类型转换为int **,否则编译报错    printf("a[2][1] == %d\n", v );     return 0; }

注意:在方法三种这种写法是错误的:return *(*(a+i)+j) ;不要误以为对int **类型的a+i后,会跳跃寻址,二维数组在内存中就是和一位数组一样连续存放的。编译器并没有为对int **类型提供特殊的运算支持。

0 0
原创粉丝点击