【C 語言入門】188.使用指標陣列在函式間傳遞二維陣列

如果我們希望在利用指標陣列在函式間傳遞二維陣列。

我們都知道,v 本身是個陣列,可以先隱形轉型成 v[0] 的位址。

那我們可能會這樣表達。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    print(v,3,3);
    return 0;
}

v[0] 的位址其實是由 int v[2] 變成 int (*)。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    print(&v[0],3,3);     //(int **) = (int (*)[3]);
    return 0;
}

做完後它已經是個指標了,&v[0],不會再隱性轉型了。

陣列要隱性轉型成指標的時候只能轉一層,不能連續套用這個規則。

那如果我們希望 print 可以套用在任意的長寬的比例可以怎麼做呢?

使用指標陣列

那我們接下來講講怎麼使用指標陣列在函式間傳遞二維陣列。

我們在文章的一開始說了我們只能把一個維度變成指標,另一個維度我們還是必須具體的給它一個數字。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<height;i++){
        for(j=0;j<width;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    int *p[2];
    print(p,3,3);
    return 0;
}

p 是一個兩個元素的陣列,每一個元素都是一個整數的指標。

我們知道,一個陣列可以轉型成指標。

因此我們可以把 p 隱性轉型成p[0] 的位址,如下。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<height;i++){
        for(j=0;j<width;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    int *p[2];
    print(&p[0],3,3);
    return 0;
}

這時候你會發現它們型態一樣。

p[0] 本身是一個整數的指標,我們的位址就是整數的指標的指標。

那我們 v 和 p 的關係是甚麼呢?

p[0] 本身是一個整數的陣列,而整數的陣列又可以隱性轉型成整數的指標,因此我們可以在 *p[2] 存 v[0] 和 v[1],如下。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<height;i++){
        for(j=0;j<width;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    int *p[3] = { v[0], v[1], v[2]};   //(int *)  = (int [3])
    print(&p[0],3,3);            //(int **) = (int *[2])
    return 0;
}

v[0] 和 v[1] 本身都是有 3 個元素的陣列。

p[0] 存的是 v[0] 陣列的第一個元素的位置,而 p[1] 存的是 v[1] 陣列的第一個元素的位置。

p 本身又可隱性轉型成整數的指標的指標。

那一個整數的陣列可以變成整數的指標嗎?

其實是可以的,也就是 v[0] 的 0 號元素的指標和 v[1] 的 0 號元素的指標。

或者也可以這樣表達。

#include <stdio.h>
void print(int (**v), int height,int width){
    int i,j;
    for(i=0;i<height;i++){
        for(j=0;j<width;j++){
        printf("%d",v[i][j]);
    }
    }
    printf("\n");
}

int main()
{
    int v[3][3] ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    int *p[3] = { &v[0][0], &v[1][0],  &v[2][0]};   //(int *)  = (int [3])
    print(p,3,3);            //(int **) = (int *[2])
    return 0;
}

p 本身是一個陣列,他複製他第一個元素的位置變成 print 函式的 v。

print 函式的 v[i] 其實也就是 main 裡面的 v[i]。

Leave a Comment

Your email address will not be published. Required fields are marked *