C語言用二維陣列作為函式入口引數的小結

紙上得來終覺淺 絕知此事要躬行發表於2020-10-03

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()的二維或三維指標來搞定。

相關文章