C 語言中關于通過形參傳遞數組的長度計算的一些思考
一 背景
學習 C 語言的過程中,計算數組的長度經常會碰到。在字元型的數組中我們可以使用 strlen() 來擷取目前數組的長度,對于其他類型的數組,這個方法就不适用了。由于經常會遇到計算數組長度的問題,經過思考,考慮通過一個函數來實作數組長度的計算。思路是這樣的:通過形參将數組傳遞給長度計算函數,長度計算函數計算完成之後傳回數組長度。但是在實際實踐過程中遇到了問題,請繼續往下看!
二 實作代碼
根據以上構想,寫了如下一段 demo:
# include<stdio.h>
int main(int argc, char * argv[])
{
int a[] = {2, 6, 3, 5, 9};
// int length(int *);
int length(int []);
printf("The length of this array is: %d\n",length(a));
printf("The length of this array is: %d\n",sizeof a /sizeof a[0]);
return 0;
}
// int length(int *a)
int length(int a[])
{
int length;
length = sizeof a / sizeof a[0];
return length;
}
執行結果:
The length of this array is: 2
The length of this array is: 5
三 結果分析及總結
- 3.1 第一個結果,通過形參傳遞給數組長度計算函數來計算數組長度,得到的結果是: 2。很明顯,這是一個錯誤的結果。
- 3.2 第二個結果,直接計算數組長度,符合預期。
- 3.3 通過查閱相關資料,得出以下結論:
a[] 是長度計算的形式參數,在 main)() 函數中調用時,a 是一個指向數組第一個元素的指針。在執行 main() 函數時,不知道 a 所表示的位址有多大的資料存儲空間,隻是告訴函數:一個資料存儲空間首位址。
sizoef a 的結果是指針變量 a 占記憶體的大小,一般在 64 位機上是8個位元組。a[0] 是 int 類型,sizeof a[0] 是4個位元組,結果是2。為此,我們再來看一下下面一段代碼:
# include<stdio.h>
int main(int argc, char * argv[])
{
int a[] = {2, 6, 3, 5, 9};
// int length(int *);
int length(int []);
int *p;
p = a;
printf("The length of this array is: %d\n", length(a));
printf("The length of this array is: %d\n", sizeof a /sizeof a[0]);
printf("The length of this pointer is: %d\n", sizeof p);
return 0;
}
// int length(int *a)
int length(int a[])
{
int length;
length = sizeof a / sizeof a[0];
return length;
}
The length of this array is: 2
The length of this array is: 5
The length of this pointer is: 8