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