C/C++語言 二維數組作爲函數的參數總結


C/C++語言二維數組作爲函數的參數總結

一、  情況1:實參爲二維數組

比如    int a[3][3];

調用形式    print(a);

 

//指針形式

void print(int** a);      //ERROR
void print(int* a[3]);    //ERROR;這是一個數組,不能將數組直接傳值;因此錯誤
void print(int (*a)[3]);  //OK  二維數組轉數組指針
//純數組形式
void print(int a[3][3]);  //OK    等同於void print(int(*a)[3]);
void print(int a[4][3]);  //OK    等同於void print(int(*a)[3]);
void print(int a[3][4]);  //ERROR 等同於void print(int(*a)[4]);
void print(int a[][3]);   //OK    等同於void print(int(*a)[3]);
void print(int a[][]);    //ERROR  類似於,但卻不是void print(int** a);
void print(int a[3][]);   //ERROR  類似於,但卻不是void print(int (*a)[3]);
//這本身就是傳參過程中的一個錯誤寫法;即不可能先知道高維維度,不知低維維度


 

二、  情況2:實參爲指針數組

比如    

int* a[3]
int b[3][3] = { 0 };
for(int i = 0; i < 3; ++i){ a[i] = b[i]; }

調用形式    print(a);

 

//指針形式

void print(int** a);      //OK
void print(int* a[3]);    //OK 
void print(int (*a)[3]);  //ERROR
//純數組形式
void print(int a[3][3]);  //ERROR    等同於void print(int (*a)[3]);
void print(int a[4][3]);  //ERROR    等同於void print(int(*a)[3]);
void print(int a[3][4]);  //ERROR    等同於void print(int(*a)[4]);
void print(int a[][3]);   //ERROR    等同於void print(int(*a)[3]);
void print(int a[][]);    //ERROR   無法將其轉化爲void print(int** a);
void print(int a[3][]);   //ERROR  這本身就是傳參過程中的一個錯誤寫法;即不可能先知道高維維度,不知低維維度


三、  情況3:實參爲數組指針

比如    int (*a)[3];

       int b[3][3] = {0};

       a = b;

調用形式     print(a);

 

//指針形式

void print(int** a);      //ERROR
void print(int* a[3]);    //ERROR 
void print(int (*a)[3]);  //OK
//純數組形式
void print(int a[3][3]);  //OK    等同於void print(int(*a)[3]);
void print(int a[4][3]);  //OK    等同於void print(int(*a)[3]);
void print(int a[3][4]);  //ERROR    等同於void print(int(*a)[4]);
void print(int a[][3]);   //OK    等同於void print(int(*a)[3]);
void print(int a[][]);    //ERROR   無法將其轉化爲void print(int**a);
void print(int a[3][]);   //ERROR 這本身就是傳參過程中的一個錯誤寫法;即不可能先知道高維維度,不知低維維度
 


四、  情況4:實參爲二維指針

比如   

int** a;
int b[3][3] = { 0 };
int* c[3];
for(int i = 0; i < 3; ++i){ c[i] = b[i]; }
a = c;

 

調用形式    print(a);

//指針形式

void print(int** a);      //OK
void print(int* a[3]);    //OK 等價於void print(int** a);
void print(int (*a)[3]);  //ERROR
//純數組形式
void print(int a[3][3]);  //ERROR    等同於void print(int(*a)[3]);
void print(int a[4][3]);  //ERROR    等同於void print(int(*a)[3]);
void print(int a[3][4]);  //ERROR    等同於void print(int(*a)[4]);
void print(int a[][3]);   //ERROR    等同於void print(int(*a)[3]);
void print(int a[][]);    //ERROR   無法將其轉化爲void print(int**a);
void print(int a[3][]);   //ERROR 這本身就是傳參過程中的一個錯誤寫法;即不可能先知道高維維度,不知低維維度


五、  總結

序號

              實參形式





形參形式

二維數組
int a[3][3];

指針數組
int* a[3];

數組指針
int (*a)[3]

二維指針
int** a;

1

void print(int** a);

2

void print(int* a[3]);

3

void print(int (*a)[3]);

4

void print(int a[3][3]);

5

void print(int a[4][3]);

6

void print(int a[3][4]);

7

void print(int a[][3]);

8

void print(int a[][]);

9

void print(int a[3][]);

備註:√表示調用成功;ⅹ表示調用失敗。

通過表格,可知:

(1) 1與2的形式完全等價;

(2) 3、4、5和7的形式完全等價

(3) 8和9屬於非法形式

(4) 通過4,5,6,7,可知:

對於傳數組,低維階數一致是一個必要條件。6必然非法。

對於高階維數的維度其實沒有傳遞給函數,只是象徵意義上的顯示,沒有實際意義。

5.1   單一降次

意思就是說,每次都可以將數組降爲指針,但每次只能降一次。對於每次函數調用只能順次降一級,多次下降必然報錯;也就是說,對於二維數組,可以用數組指針傳值,但是如果用二維指針傳遞就會報錯。

5.2   實質:傳遞指針

記住,實參形參之間進行傳遞的實質:始終傳遞的是指針,不可能是數組

對於二維數組實參,傳遞參數的時候,它已經將爲數組指針;對於形式參數裏面的[],每次轉換隻能轉換其中的一個爲指針,如果轉換之後的指針,與傳遞過來實參參數的指針一致,則參數之間可以進行參數傳遞。

 

--------------------------------------------------------------------

PS:真正在傳遞二維指針的時候,還需要考慮到二維數組的維度。

比如:int a[10];    正確的函數參數形式應該爲void print(int* a, int n);

二維指針也是同理。三維指針也是。如果掌握以上知識,做到正確傳參數,應該不是問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章