C語言數組長度的計算方法實例總結(sizeof與strlen)

前言

最近在重新學習C語言,學習中發現之前對數組長度的計算方法模糊不清。因此做個總結。

首先要明白什麼是數組。

數組是一組相同類型元素的集合。

因此,要定義一個數組,首先要確定數組內的元素是同一種類型。

1. 數組的創建

首先來看看常用的數組的創建形式

  • int型
	int arr1 [10] = {0};//定義瞭元素個數,且給第一個元素賦值為0,則其他元素均為0

通過VS調試中的監視功能,可以看到各個數組的存放結果。

int arr2 [10] = {1, 2, 3, 4, 5};//定義瞭元素個數,但隻給前五個元素賦值,則後五個元素均為0

int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義瞭元素個數,且給所有元素均賦值

int arr4 [10];//什麼都不放,編譯器會給數組的每個元素放置隨機數。

int arr5[] = {1, 2, 3};//不定義元素個數,給幾個元素賦值就有幾個元素。

註意:

如果你定義瞭數組的大小(也就是【】號裡面寫瞭數字),但是沒有給任何元素賦值,那麼這個數組的所有元素都默認為一個隨機數!!!如果你定義瞭數組大小,但隻給部分元素賦值,那麼剩餘元素的值默認為0!!!(見上面arr4和arr5)。

因此常用上面arr1的方式,給int型數組的全部元素設置默認值為0.

  • char型
	char arr6[] = "abc";//沒有定義元素個數,用雙引號定義3個字符,末尾數組會自動加上結束標志(\0)

char arr7 [10] = "abc";//定義10個元素個數,用雙引號賦值三個字符串,其餘7個元素均自動定義為\0

char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數,用大括號和單引號賦值三個字符串,則數組隻含有三個字符,剩餘7個均為\0

char arr9 [10] = {'a', 98, '98'};//char定義數組,元素中出現沒有用單引號的數字,會根據ASCII碼輸出字符

	char arr10[] = {'a', 'b', 'c'};//沒有定義元素個數,用大括號定義字符串,數組的元素個數則隻有三個,結尾沒有數組結束標志(\0)

註意:

要格外註意舉例中arr10和arr6的不同。同樣為插入abc三個字符,但是arr6結尾有\0,arr10卻沒有,這在下一步求解數組長度的時候有相當大的區別!!!

2. 求解數組的長度

求解數組長度往往要用到兩個函數,strlen或者sizeof

  • strlen求解數組長度

strlen是用來求一個字符串(string)的長度,因此strlen不能用來求int類型的數組長度,隻能求char類型的數字長度。
具體代碼如下:

	char arr6[] = "abc";//沒有定義元素個數,用雙引號定義3個字符,末尾數組會自動加上結束標志(\0)
	printf("length arr6 = %d\n", strlen(arr6));

	char arr7 [10] = "abc";//定義10個元素個數,用雙引號賦值三個字符串,其餘7個元素均自動定義為\0
	printf("length arr7 = %d\n", strlen(arr7));

	char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數,用大括號和單引號賦值三個字符串,則數組隻含有三個字符,剩餘7個均為\0
	printf("length arr8 = %d\n", strlen(arr8));

	char arr9 [10] = {'a', 98, '98'};//char定義數組,元素中出現沒有用單引號的數字,會根據ASCII碼輸出字符
	printf("length arr9 = %d\n", strlen(arr9));

	char arr10 [] = {'a', 'b', 'c'};//沒有定義元素個數,用大括號定義字符串,數組的元素個數則隻有三個,結尾沒有數組結束標志(\0)
	printf("length arr10 = %d\n", strlen(arr10));

註意:

1、從arr6和arr7中可以看出,用雙引號定義的字符串數組都能正確計算出數組長度。這是因為這兩個數組的****末尾都含有結束標志”\0“(具體看前面舉例中的截圖)。

2、另外要註意的是,arr10輸入瞭三個字符,但結果卻是15個,這是因為在沒有定義數組個數的時候,用大括號的形式賦值,結尾不會自動補充結束標志\0,導致這個結果是個隨機數,strlen會在內存中一直計數,知道在內存中遇到瞭0才會停止技術。
但是對比arr8和arr9,也是用瞭大括號賦值,但結果卻是正確的,這是因為開始定義瞭數組的個數,沒有初始化賦值的數組會默認賦值為0(與\0有一樣的效果)。

3、如果用strlen用來求int類型數組的長度,會發現strlen不能用瞭。

	int arr1 [10] = {0};//定義瞭元素個數,且給第一個元素賦值為0,則其他元素均為0
	printf("length arr1 = %d\n", strlen(arr1));

	int arr2 [10] = {1, 2, 3, 4, 5};//定義瞭元素個數,但隻給前五個元素賦值,則後五個元素均為0
	printf("length arr2 = %d\n", strlen(arr2));

	int arr4 [10];//什麼都不放,編譯器會給數組的每個元素放置隨機數。
	printf("length arr4 = %d\n", strlen(arr4));

  • sizeof求解數組長度

sizeof能計算變量或者數據類型所占用的內存(以字節為單位)。用sizeof計算數組長度時,sizeof不關心數組內部存儲的是什麼類型的數據。
所以常常用 sizeof(arr)/sizeof(arr[0]) 來計算數組的長度。其中“sizeof(arr)“計算瞭整個數組arr占據瞭多少內存(字節為單位),”sizeof(arr[0])“計算瞭數組中第一個元素所占多少字節,兩者相除就是數組的長度。

代碼如下:

	int arr1 [10] = {0};//定義瞭元素個數,且給第一個元素賦值為0,則其他元素均為0

	int arr2 [10] = {1, 2, 3, 4, 5};//定義瞭元素個數,但隻給前五個元素賦值,則後五個元素均為0

	int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義瞭元素個數,且給所有元素均賦值

	int arr4 [10];//什麼都不放,編譯器會給數組的每個元素放置隨機數。
	
	int arr5[] = {1, 2, 3};//不定義元素個數,給幾個元素賦值就有幾個元素。

	int len1 = sizeof(arr1) / sizeof(arr1 [0]);
	int len2 = sizeof(arr2) / sizeof(arr2 [0]);
	int len3 = sizeof(arr3) / sizeof(arr3 [0]);
	int len4 = sizeof(arr4) / sizeof(arr4 [0]);
	int len5 = sizeof(arr5) / sizeof(arr5 [0]);

	printf("length arr1 = %d\n", len1);
	printf("length arr2 = %d\n", len2);
	printf("length arr3 = %d\n", len3);
	printf("length arr4 = %d\n", len4);
	printf("length arr5 = %d\n", len5);

可以看出,如果你一開始就定義瞭數組的大小,那麼不管你插入多少個元素,求出來的結果永遠是你定義的數組大小。

如果你沒有定義數組大小,那麼算出來的就是你實際賦值的數組大小。

	char arr6 [] = "abc";//沒有定義元素個數,用雙引號定義3個字符,末尾數組會自動加上結束標志(\0)

	char arr7 [10] = "abc";//定義10個元素個數,用雙引號賦值三個字符串,其餘7個元素均自動定義為\0

	char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數,用大括號和單引號賦值三個字符串,則數組隻含有三個字符,剩餘7個均為\0

	char arr10 [] = {'a', 'b', 'c'};//沒有定義元素個數,用大括號定義字符串,數組的元素個數則隻有三個,結尾沒有數組結束標志(\0)

	int len6 = sizeof(arr6) / sizeof(arr6 [0]);
	int len7 = sizeof(arr7) / sizeof(arr7 [0]);
	int len8 = sizeof(arr8) / sizeof(arr8 [0]);
	int len10 = sizeof(arr10) / sizeof(arr10 [0]);

	printf("length arr6 = %d\n", len6);
	printf("length arr7 = %d\n", len7);
	printf("length arr8 = %d\n", len8);
	printf("length arr10 = %d\n", len10);

註意:

從arr6可以看出,當用sizeof求char類型數組的長度時,如果你沒有定義數組長度,那麼得出的結果會比實際大小大1。這是因為sizeof吧數組結尾的\0也算瞭進去。

從arr7和arr8可以看出,如果定義瞭數組大小,跟int類型一樣,不管怎麼定義,定義瞭多少,結果都是你定義的那個數組大小。

從arr10可以看出,如果你輸入數組時用瞭大括號賦值,並且在結尾沒有手動輸入\0,那麼算出的結果就是實際賦值的個數。

總結:

  1. 定義數組時,要先明確數組的類型(int還是char或者其他類型)。
  2. sizeof不能用來計算已經定義好長度的數組的數組長度(如int arr[10] = {0},不能有中括號裡的10)。
  3. strlen不能用來計算int類型的數組長度。
  4. int型計算數組長度,最好用 sizeof(arr) / sizeof(arr[0]) 來計算數組長度。
  5. char型數組如果要計算數組長度,一定要用雙引號賦值。
  6. char型數組如果要用大括號賦值,一定要註意數組最後是否需要結束標志 \0

到此這篇關於C語言數組長度的計算方法的文章就介紹到這瞭,更多相關C語言數組長度計算方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: