C語言二維陣列作為函式引數傳遞

2021-07-02 06:27:13 字數 962 閱讀 1303

二維陣列中元素排列的順序是按行存放的,即在記憶體中先順序存放第一行的元素,再存放第二行的元素...

二維陣列作為函式引數,實參可以直接使用二維陣列名,在被呼叫函式中對形引數組定義可以指定所有維數的大小,也可以省略第一維的大**明,如:

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

void f(int a[4]);

它們是合法且等價,也可以使用如下形式:

void f(int (*a)[4]);

但不能省略第二維的大小,如下面的定義是不合法的,編譯時會出錯:

void f(int a);

void f(int a[3]);

因為從實參傳遞來的是陣列的起始位址,如果在形參中不說明列數,編譯器將無法定位元素的的位置。

如果二維陣列的各個維數不固定,我們將不能使用以上定義方法,可以通過以下2種簡單的方法實現。

被呼叫函式定義:

void f(int *a,int n);
實參傳遞:

int a[3][4];

f(*a,12);

被呼叫函式定義:

void f(int **a,int m,int n);
實參傳遞:

int a[3][4];

f((int **)a,3,4);

這樣在被呼叫陣列中對對元素a[i][j]的訪問可以使用如下形式:

*((int *)a+n*i+j);
注意不能使用a[i][j]來直接訪問,因為編譯器無法為其定位,若直接使用a[i][j]在ubuntu上會報「段錯誤(核心已轉儲)」的錯誤,段錯誤(核心已轉儲)我之前的部落格提到過。

二維陣列作為函式引數傳遞(C )

有時候我們也許會不明白為什麼c 中的陣列宣告的時候下標是需要乙個常數,而不能是乙個變數吶?也許stl模板庫中的向量可以解決變數作為下標的陣列宣告方式,為了節約一些記憶體或者是提高一些效能,也為了功能不重複,故而陣列中的下標採取了常量的方式。int a 5 可行的 const int max 10 i...

二維陣列作為函式引數傳遞(C )

有時候我們也許會不明白為什麼c 中的陣列宣告的時候下標是需要乙個常數,而不能是乙個變數吶?也許stl模板庫中的向量可以解決變數作為下標的陣列宣告方式,為了節約一些記憶體或者是提高一些效能,也為了功能不重複,故而陣列中的下標採取了常量的方式。int a 5 可行的 const int max 10 i...

二維陣列作為引數傳遞

void getoffdata float offdata,int col void main 報錯d qt projects rssi position main.cpp 17 error cannot convert float 16 to float for argument 1 to voi...