C语言里面定义了二维数组 int arr[100][200]; 那arr就是一个指针,指针类型是什么呢?是int(*)[200]。
所以最自然的是用下面的func2(int (*a)[200]) 或func3(int a[][200]),这样main函数调用的时候直接用func2(arr)或func3(arr)就可以了。这里的a是一个指针,指向一个int数组,这个数组有200个元素。
当然也可以用func0(int *a),但func0里面不能直接用a[i][j],因为编译器不认识。 访问a[i][j]要用*(a + 200 * i + j)。
也可以用func1(int **a),这是要注意先把a转换为一维的(int *)数组,然后再用*((int *)a + 200 * i + j)来访问。
#include <stdio.h> void func0(int *a) { printf("In func0()\n"); //a[2][6] = 921; // the compiler cannot recognize it!!! *(a + 200 * 2 + 6) = 921; } void func1(int **a) { printf("In func1()\n"); //a[2][6] = 921; // the compiler cannot recognize it!!! *((int *)a + 200 * 2 + 6) = 921; } void func2(int (*a)[200]) { printf("In func2()\n"); a[0][1] = 234; a[3][4] = 723; printf("a = %p, a + 1 = %p\n", a, a + 1); printf("a[3][4] = %d\n", a[3][4]); return; } void func3(int a[][200]) { printf("In func3()\n"); a[0][1] = 234; a[3][4] = 723; printf("a = %p, a + 1 = %p\n", a, a + 1); printf("a[3][4] = %d\n", a[3][4]); return; } int main() { int arr[100][200]; printf("arr = %p &arr[0] = %p\n", arr, &arr[0]); printf("arr + 1 = %p arr + 2 = %p\n", arr + 1, arr + 2); char *p = (char *)arr; printf("p = %p p + 1 = %p\n", p, p + 1); printf("sizeof(arr) = %lu\n", sizeof(arr)); func0((int *)arr); func1((int **)arr); func2(arr); func3(arr); printf("arr[2][6]=%d\n", arr[2][6]); return 0; }扩展到3维数组怎么办呢?假设我们定义了int arr[100][200][300]。 实际上类似func2(), func3(),我们可以用 func2(int (*a)[200][300]) 或 func2(int a[][200][300]) 当然也可以用类似func0()或func1()的二维或三维指针来搞定。