向函数传递一维数组和已知大小的二维数组
一維數組
在C語言中,向函數傳遞參數只有一種形式——值傳遞。不管是傳遞一個整型變量,還是傳遞一個指針,函數得到的都只是實參的拷貝值。
先定義一個一維整型數組:
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };首先明確一點:數組名和指針是兩個不同的概念,盡管數組名在絕大部分情況下被隱式轉換成指針使用。
我們沒辦法真正地把數組傳遞給函數,我們只能傳遞一份指向數組起始位置的指針的拷貝。
函數原型:
void func(int *a); void func(int a[]);在當前這個上下文環境中,二者等價。你可以使用任何一種聲明,如果要說哪一種最準確,應該是第一種。因為實參實際上是個指針,而不是數組。
這樣我們就把指向數組首元素的指針的拷貝傳遞給了函數。在實際應用中,我們通常還會傳遞另一個參數,用來表示數組的長度:
void func(int *a, int len);通過第二個參數,我們可以很方便地在函數內遍歷這個數組:
void func(int *a, int len) {int i = 0;while (i < len) {printf("%d ", a[i]);i++;} }func(a, 10); // 打印數組a的所有元素二維數組
接下來是二維數組,傳遞二維數組參數有更多需要注意的點。
先定義一個二維整型數組:
我們實際上要向數組傳遞一個指向數組首元素的指針的拷貝,首先必須搞清楚數組名b的類型應該是:
int (*)[3]數組名的類型取決于數組元素,數組b長度是2,每個元素是長度為3的整型數組,所以b的類型是上面那坨(如果這里有疑問可以看我的另一篇文章《徹底弄懂C語言數組名》)。
如果上面的內容沒有疑問,那么就來看函數原型:
同樣地,我們可以傳遞另外兩個參數,分別表示行數和列數:
void func2(int (*p)[3], int len_i, int len_j);但是請千萬注意:寫成二級指針是錯誤的!
void func2(int **p); // 不可以這樣~>_<~為什么不行呢?因為指向指針的指針和指向數組的指針是不同的。如果這樣寫,有可能你的程序能正確運行,但也有可能因為尋址錯誤導致程序崩潰哦!
下面給出完整的例子:
#include <stdio.h>void func2(int (*p)[3], int len_i, int len_j);int main() {int a[2][3] = { {0, 1, 2}, {3, 4, 5}};func2(a, 2, 3);return 0; }void func2(int (*p)[3], int len_i, int len_j) {int i, j;for (i = 0; i < len_i; i++) {for (j = 0; j < len_j; j++) {printf("%d ", p[i][j]);}printf("\n");} }但是,不知道你有沒有發現一個問題,我們必須在函數原型中指定第二維的大小,這意味著函數不能復用。為了向函數傳遞一個大小未知的數組,我將介紹兩種技巧。
第一種是通過void *指針接收一個數組,同時傳遞兩個參數標記行和列,然后在函數內部將void *指針強制轉換成二維數組。
還有一種技巧叫做壓扁數組(flattening the array),是通過一級指針遍歷二維數組的方法。只要數組在內存中連續,這個技巧就可以用。我將在下一篇文章中詳細介紹這個技巧。
總結
以上是生活随笔為你收集整理的向函数传递一维数组和已知大小的二维数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: while((ch=getchar())
- 下一篇: 输入密码显示星号