C語言二維數組作為函數的參數


  前言:今天在實現裝配線調度程序時候,用到了二維數組,並將其作為函數的參數。在寫程序的時候,遇到一些問題,即二維數組做函數的參數應該如何正確表示。我寫程序的錯誤如下程序所示:

復制代碼
 1 #include <cstdio>
 2 void print(int *a[3])  3 {  4 printf("%d\n",a[0][0]);  5 }  6  7 int main()  8 {  9 int a[2][3] = {1,2,3,4,5,6}; 10  print(a); 11 return 0; 12 }
復制代碼

編譯程序時候,在第10行提示錯誤信息:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。根據錯誤提示我明白了,   int *a[3]表示一個一維數組,數組的數據類型為整型指針(int*),數組的大小為3,這是因為[]的優先級高於*的優先級。如是我將程序改寫如下,順利通過編譯,得到正確結果。

復制代碼
 1 #include <cstdio>
 2 void print(int (*a)[3]) //用括號將指針括起來  3 {  4 printf("%d\n",a[0][0]);  5 }  6  7 int main()  8 {  9 int a[2][3] = {1,2,3,4,5,6}; 10  print(a); 11 return 0; 12 }
復制代碼

下面來總結一下二維數組作為函數參數該如何表示。

1、二維數組的概念

  在C語言中,二維數組實際上是一種特殊的一維數組,它的每個元素也是一個一維數組。因此,二維數組下標形式正確寫法如下:int arrays[i][j]。數組元素是按照行順序存儲的,因此當按存儲順序訪問樹時,最右邊的數組下標(列)變化的最快。

2、二維數組作為函數參數

  規定:如果將二維數組作為參數傳遞給函數,那么在函數的參數聲明中必須指明數組的列數,數組的行數沒有太大關系,可以指定也可以不指定。因為函數調用時傳遞的是一個指針,它指向由行向量夠成的一維數組。因此二維數組作為函數參數正確寫法如下所示:   

void Func(int array[3][10]); 

void Func(int array[ ][10]);

因為數組的行數無關緊要,所以還可以寫成如下形式:

void Func(int (*array)[10]);  注意*array需要用括號括起來。

這種形式的聲明參數是一個指針,它指向具有10個元素的一維數組。因為[]的優先級比*的優先級高,故*array必須用括號括起來,否則變成了

void Func(int *array[10]);

這時候參數相當於是聲明了一個數組,該數組有10個元素,其中每個元素都是一個指向整型對象的指針。

但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

 void Func(int array[ ][ ]);

  因為從實參傳遞來的是數組的起始地址,在內存中按數組排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維,下面寫法是錯誤的: 

void Func(int array[3][ ]);

  實參數組維數可以大於形參數組,例如形參數組定義為: 

 void Func(int array[3][10]); 

而實參數組定義為:int array[5][10];     進行函數調用Func(array)時,由於數組在內存中是連續存放的,雖然形參與實參數組行數不對應,但是列數是相同的,具有相同的起始地址,這樣可以訪問到后續的值。如下述程序:

復制代碼
 1 #include <stdio.h>
 2  3 void print_array(int *array, int len)  4 {  5 int i = 0;  6 for ( ; i < len; i++) {  7 printf("%d ",array[i]);  8  }  9 putchar('\n'); 10 } 11 12 void func(int array[3][10]) 13 { 14 print_array(array[0], 10); 15 print_array(array[1], 10); 16 print_array(array[2], 10); 17 print_array(array[3], 10); 18 print_array(array[4], 10); 19 } 20 21 int main() 22 { 23 int array[5][10] = { 24 {0,1,2,3,4,5,6,7,8,9}, 25 {10,11,12,13,14,15,16,17,18,19}, 26 {20,21,22,23,24,25,26,27,28,29}, 27 {30,31,32,33,34,35,36,37,38,39}, 28 {40,41,42,43,44,45,46,47,48,49} 29  }; 30  func(array); 31 return 0; 32 }
復制代碼

 參考資料:

1、http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html

2、K&R《C語言程序設計》第二版P95-P97


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM