C 語(yǔ)言中關(guān)于通過(guò)形參傳遞數(shù)組的長(zhǎng)度計(jì)算的一些思考
一 背景
學(xué)習(xí) C 語(yǔ)言的過(guò)程中,計(jì)算數(shù)組的長(zhǎng)度經(jīng)常會(huì)碰到。在字符型的數(shù)組中我們可以使用 strlen()
來(lái)獲取當(dāng)前數(shù)組的長(zhǎng)度,對(duì)于其他類型的數(shù)組,這個(gè)方法就不適用了。由于經(jīng)常會(huì)遇到計(jì)算數(shù)組長(zhǎng)度的問(wèn)題,經(jīng)過(guò)思考,考慮通過(guò)一個(gè)函數(shù)來(lái)實(shí)現(xiàn)數(shù)組長(zhǎng)度的計(jì)算。思路是這樣的:通過(guò)形參將數(shù)組傳遞給長(zhǎng)度計(jì)算函數(shù),長(zhǎng)度計(jì)算函數(shù)計(jì)算完成之后返回?cái)?shù)組長(zhǎng)度。但是在實(shí)際實(shí)踐過(guò)程中遇到了問(wèn)題,請(qǐng)繼續(xù)往下看!
二 實(shí)現(xiàn)代碼
根據(jù)以上構(gòu)想,寫(xiě)了如下一段 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; }
執(zhí)行結(jié)果:
The length of this array is: 2 The length of this array is: 5
三 結(jié)果分析及總結(jié)
* 3.1 第一個(gè)結(jié)果,通過(guò)形參傳遞給數(shù)組長(zhǎng)度計(jì)算函數(shù)來(lái)計(jì)算數(shù)組長(zhǎng)度,得到的結(jié)果是: 2。很明顯,這是一個(gè)錯(cuò)誤的結(jié)果。
* 3.2 第二個(gè)結(jié)果,直接計(jì)算數(shù)組長(zhǎng)度,符合預(yù)期。
* 3.3 通過(guò)查閱相關(guān)資料,得出以下結(jié)論:
a[] 是長(zhǎng)度計(jì)算的形式參數(shù),在 main)() 函數(shù)中調(diào)用時(shí),a 是一個(gè)指向數(shù)組第一個(gè)元素的指針。在執(zhí)行 main() 函數(shù)時(shí),不知道 a
所表示的地址有多大的數(shù)據(jù)存儲(chǔ)空間,只是告訴函數(shù):一個(gè)數(shù)據(jù)存儲(chǔ)空間首地址。
sizoef a 的結(jié)果是指針變量 a 占內(nèi)存的大小,一般在 64 位機(jī)上是8個(gè)字節(jié)。a[0] 是 int 類型,sizeof a[0]
是4個(gè)字節(jié),結(jié)果是2。為此,我們?cè)賮?lái)看一下下面一段代碼:
# 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; }
執(zhí)行結(jié)果:
The length of this array is: 2 The length of this array is: 5 The length of
this pointer is: 8
熱門(mén)工具 換一換
