天天看點

C 語言中關于通過形參傳遞數組的長度計算的一些思考C 語言中關于通過形參傳遞數組的長度計算的一些思考

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           

繼續閱讀