二維陣列作為函式引數深度詳解

2021-07-02 16:10:29 字數 2581 閱讀 8501



前幾天和同學討論陣列作為函式引數,感覺各種困惑。花了一些時間在網上檢視了一些資料,並加上自己的理解。記錄一下!

一. 指向指標的指標和指向陣列的指標

很多人以為「指向陣列的指標」就是「指向指標的指標」,於是有人寫這樣的**:

int a[3][4];

int **p = a; 

//錯誤

陣列實際型別是int [3][4],在作為右值時可以被轉化為int (*)[4],它們都和int **不同,自然不可用。

那麼,你要用乙個指標來指向a,就要用乙個能表示 " 陣列 」 的指標,以下**是正確的:

int (*p)[4] = a; p是指向一維陣列的指標,並且這個一維陣列有4個元素。

a[0][0] 需要乙個指向整型的指標 :int *p = &a[0][0];

a[0]     需要乙個指向陣列的指標 :int (*p)[4] = &a[0]; ( 同 int (*p)[4] =  a ,

[4]不能少,因為指向陣列的指標必須知道他所指向的陣列的維度)

a         需要乙個指向陣列的陣列的指標,即指向二維陣列的指標: int (*p)[3][4] = &a;

測試:

int a[3][4];

int (*p1)[4] = a;

int (*p2)[3][4] = &a;

cout輸出:從結果可以看出p1+1偏移了一行的長度,p2+1偏移了整個陣列的長度。

二. 二維陣列作為函式引數

陣列做為形參時,退化為指標

三維陣列,退化為指向二維陣列的指標

二維陣列,退化為指向一維陣列的指標

一維陣列,退化為指向型別(如int)的指標

1,這種方式形參為一級指標,即指向整型的指標,這個簡單。

int func(int *array, int m, int n)

return 0; }

return 0;

}int main(int argc,char** argv) ,,};

func(*array,m,n); 

//或者func2((int *)array,m,n);

int b[2][3];

return 0;

}輸出:

2. 這種方式是實參轉化為指向陣列的指標 (即: (int*))

int func(int array[3], int m, int n)

return 0;

}int main(int argc,char** argv) ,,};

func(array,m,n);

return 0;

}輸出:

3. 一種錯誤的方式:

int func1(int **array, int m, int n)

return 0;

}int main(int argc,char** argv) ,,};

func1((int **)array,m,n);

return 0;

}如前所述,陣列array[3][3]作為右值的時候會轉化為(int *)[3],若不加強制轉換**是不能編譯通過的。

加了以後雖然編譯不錯,但是執行的時候有非法記憶體訪問。下面詳細解析一下這一**:

*(*array +i*n +j) 

當 i=0, j=0時:

*array, 實際上就是取了array這個位址所存的內容,當然就是陣列的第乙個元素" 1 ",  從而 *array +i*n +j = 1;

對位址1來解引用還報記憶體錯誤嗎?

4. 陣列的引用作為函式的引數

形參用引用,形式上和指標作為引數差不多,但是可以在函式裡面通過sizeof計算陣列的大小,

void test( int (&array)[2][3] )

int main(int argc,char** argv)

輸出:

參考:



二維陣列 作為函式引數

前言 今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示 1 include 2 void print int a 3 3 67intmain 8 10print a 11return0...

linux C 二維陣列 作為函式引數

c語言中怎麼用二維陣列作為函式引數 可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大 明,如 void func int array 3 10 void func int array 10 二者都是合法而且等價,但是不能把第二維或者更高維的...

C C 一維二維陣列作為函式引數

1.一維陣列傳參 呼叫函式時只傳陣列名 func a void func int a 10 void func int a 2.二維陣列傳參 呼叫函式時只傳陣列名 func a 注意 二維陣列作為引數傳遞給函式,必須指明陣列的列數 void func int a 3 10 void func int...