C語(yǔ)言數(shù)組長(zhǎng)度的計(jì)算方法實(shí)例總結(jié)(sizeof與strlen)
前言
最近在重新學(xué)習(xí)C語(yǔ)言,學(xué)習(xí)中發(fā)現(xiàn)之前對(duì)數(shù)組長(zhǎng)度的計(jì)算方法模糊不清。因此做個(gè)總結(jié)。
首先要明白什么是數(shù)組。
數(shù)組是一組相同類型元素的集合。
因此,要定義一個(gè)數(shù)組,首先要確定數(shù)組內(nèi)的元素是同一種類型。
1. 數(shù)組的創(chuàng)建
首先來(lái)看看常用的數(shù)組的創(chuàng)建形式
- int型
int arr1 [10] = {0};//定義了元素個(gè)數(shù),且給第一個(gè)元素賦值為0,則其他元素均為0
通過(guò)VS調(diào)試中的監(jiān)視功能,可以看到各個(gè)數(shù)組的存放結(jié)果。
int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個(gè)數(shù),但只給前五個(gè)元素賦值,則后五個(gè)元素均為0
int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義了元素個(gè)數(shù),且給所有元素均賦值
int arr4 [10];//什么都不放,編譯器會(huì)給數(shù)組的每個(gè)元素放置隨機(jī)數(shù)。
int arr5[] = {1, 2, 3};//不定義元素個(gè)數(shù),給幾個(gè)元素賦值就有幾個(gè)元素。
注意:
如果你定義了數(shù)組的大?。ㄒ簿褪恰尽刻?hào)里面寫了數(shù)字),但是沒(méi)有給任何元素賦值,那么這個(gè)數(shù)組的所有元素都默認(rèn)為一個(gè)隨機(jī)數(shù)?。?!如果你定義了數(shù)組大小,但只給部分元素賦值,那么剩余元素的值默認(rèn)為0?。。。ㄒ娚厦鎍rr4和arr5)。
因此常用上面arr1的方式,給int型數(shù)組的全部元素設(shè)置默認(rèn)值為0.
- char型
char arr6[] = "abc";//沒(méi)有定義元素個(gè)數(shù),用雙引號(hào)定義3個(gè)字符,末尾數(shù)組會(huì)自動(dòng)加上結(jié)束標(biāo)志(\0)
char arr7 [10] = "abc";//定義10個(gè)元素個(gè)數(shù),用雙引號(hào)賦值三個(gè)字符串,其余7個(gè)元素均自動(dòng)定義為\0
char arr8 [10] = {'a', 'b', 'c'};//定義10個(gè)元素個(gè)數(shù),用大括號(hào)和單引號(hào)賦值三個(gè)字符串,則數(shù)組只含有三個(gè)字符,剩余7個(gè)均為\0
char arr9 [10] = {'a', 98, '98'};//char定義數(shù)組,元素中出現(xiàn)沒(méi)有用單引號(hào)的數(shù)字,會(huì)根據(jù)ASCII碼輸出字符
char arr10[] = {'a', 'b', 'c'};//沒(méi)有定義元素個(gè)數(shù),用大括號(hào)定義字符串,數(shù)組的元素個(gè)數(shù)則只有三個(gè),結(jié)尾沒(méi)有數(shù)組結(jié)束標(biāo)志(\0)
注意:
要格外注意舉例中arr10和arr6的不同。同樣為插入abc三個(gè)字符,但是arr6結(jié)尾有\(zhòng)0,arr10卻沒(méi)有,這在下一步求解數(shù)組長(zhǎng)度的時(shí)候有相當(dāng)大的區(qū)別?。。?/p>
2. 求解數(shù)組的長(zhǎng)度
求解數(shù)組長(zhǎng)度往往要用到兩個(gè)函數(shù),strlen或者sizeof
- strlen求解數(shù)組長(zhǎng)度
strlen是用來(lái)求一個(gè)字符串(string)的長(zhǎng)度,因此strlen不能用來(lái)求int類型的數(shù)組長(zhǎng)度,只能求char類型的數(shù)字長(zhǎng)度。
具體代碼如下:
char arr6[] = "abc";//沒(méi)有定義元素個(gè)數(shù),用雙引號(hào)定義3個(gè)字符,末尾數(shù)組會(huì)自動(dòng)加上結(jié)束標(biāo)志(\0) printf("length arr6 = %d\n", strlen(arr6)); char arr7 [10] = "abc";//定義10個(gè)元素個(gè)數(shù),用雙引號(hào)賦值三個(gè)字符串,其余7個(gè)元素均自動(dòng)定義為\0 printf("length arr7 = %d\n", strlen(arr7)); char arr8 [10] = {'a', 'b', 'c'};//定義10個(gè)元素個(gè)數(shù),用大括號(hào)和單引號(hào)賦值三個(gè)字符串,則數(shù)組只含有三個(gè)字符,剩余7個(gè)均為\0 printf("length arr8 = %d\n", strlen(arr8)); char arr9 [10] = {'a', 98, '98'};//char定義數(shù)組,元素中出現(xiàn)沒(méi)有用單引號(hào)的數(shù)字,會(huì)根據(jù)ASCII碼輸出字符 printf("length arr9 = %d\n", strlen(arr9)); char arr10 [] = {'a', 'b', 'c'};//沒(méi)有定義元素個(gè)數(shù),用大括號(hào)定義字符串,數(shù)組的元素個(gè)數(shù)則只有三個(gè),結(jié)尾沒(méi)有數(shù)組結(jié)束標(biāo)志(\0) printf("length arr10 = %d\n", strlen(arr10));
注意:
1、從arr6和arr7中可以看出,用雙引號(hào)定義的字符串?dāng)?shù)組都能正確計(jì)算出數(shù)組長(zhǎng)度。這是因?yàn)?strong>這兩個(gè)數(shù)組的****末尾都含有結(jié)束標(biāo)志”\0“(具體看前面舉例中的截圖)。
2、另外要注意的是,arr10輸入了三個(gè)字符,但結(jié)果卻是15個(gè),這是因?yàn)樵跊](méi)有定義數(shù)組個(gè)數(shù)的時(shí)候,用大括號(hào)的形式賦值,結(jié)尾不會(huì)自動(dòng)補(bǔ)充結(jié)束標(biāo)志\0,導(dǎo)致這個(gè)結(jié)果是個(gè)隨機(jī)數(shù),strlen會(huì)在內(nèi)存中一直計(jì)數(shù),知道在內(nèi)存中遇到了0才會(huì)停止技術(shù)。
但是對(duì)比arr8和arr9,也是用了大括號(hào)賦值,但結(jié)果卻是正確的,這是因?yàn)殚_始定義了數(shù)組的個(gè)數(shù),沒(méi)有初始化賦值的數(shù)組會(huì)默認(rèn)賦值為0(與\0有一樣的效果)。
3、如果用strlen用來(lái)求int類型數(shù)組的長(zhǎng)度,會(huì)發(fā)現(xiàn)strlen不能用了。
int arr1 [10] = {0};//定義了元素個(gè)數(shù),且給第一個(gè)元素賦值為0,則其他元素均為0 printf("length arr1 = %d\n", strlen(arr1)); int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個(gè)數(shù),但只給前五個(gè)元素賦值,則后五個(gè)元素均為0 printf("length arr2 = %d\n", strlen(arr2)); int arr4 [10];//什么都不放,編譯器會(huì)給數(shù)組的每個(gè)元素放置隨機(jī)數(shù)。 printf("length arr4 = %d\n", strlen(arr4));
- sizeof求解數(shù)組長(zhǎng)度
sizeof能計(jì)算變量或者數(shù)據(jù)類型所占用的內(nèi)存(以字節(jié)為單位)。用sizeof計(jì)算數(shù)組長(zhǎng)度時(shí),sizeof不關(guān)心數(shù)組內(nèi)部存儲(chǔ)的是什么類型的數(shù)據(jù)。
所以常常用 sizeof(arr)/sizeof(arr[0]) 來(lái)計(jì)算數(shù)組的長(zhǎng)度。其中“sizeof(arr)“計(jì)算了整個(gè)數(shù)組arr占據(jù)了多少內(nèi)存(字節(jié)為單位),”sizeof(arr[0])“計(jì)算了數(shù)組中第一個(gè)元素所占多少字節(jié),兩者相除就是數(shù)組的長(zhǎng)度。
代碼如下:
int arr1 [10] = {0};//定義了元素個(gè)數(shù),且給第一個(gè)元素賦值為0,則其他元素均為0 int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個(gè)數(shù),但只給前五個(gè)元素賦值,則后五個(gè)元素均為0 int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義了元素個(gè)數(shù),且給所有元素均賦值 int arr4 [10];//什么都不放,編譯器會(huì)給數(shù)組的每個(gè)元素放置隨機(jī)數(shù)。 int arr5[] = {1, 2, 3};//不定義元素個(gè)數(shù),給幾個(gè)元素賦值就有幾個(gè)元素。 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);
可以看出,如果你一開始就定義了數(shù)組的大小,那么不管你插入多少個(gè)元素,求出來(lái)的結(jié)果永遠(yuǎn)是你定義的數(shù)組大小。
如果你沒(méi)有定義數(shù)組大小,那么算出來(lái)的就是你實(shí)際賦值的數(shù)組大小。
char arr6 [] = "abc";//沒(méi)有定義元素個(gè)數(shù),用雙引號(hào)定義3個(gè)字符,末尾數(shù)組會(huì)自動(dòng)加上結(jié)束標(biāo)志(\0) char arr7 [10] = "abc";//定義10個(gè)元素個(gè)數(shù),用雙引號(hào)賦值三個(gè)字符串,其余7個(gè)元素均自動(dòng)定義為\0 char arr8 [10] = {'a', 'b', 'c'};//定義10個(gè)元素個(gè)數(shù),用大括號(hào)和單引號(hào)賦值三個(gè)字符串,則數(shù)組只含有三個(gè)字符,剩余7個(gè)均為\0 char arr10 [] = {'a', 'b', 'c'};//沒(méi)有定義元素個(gè)數(shù),用大括號(hào)定義字符串,數(shù)組的元素個(gè)數(shù)則只有三個(gè),結(jié)尾沒(méi)有數(shù)組結(jié)束標(biāo)志(\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可以看出,當(dāng)用sizeof求char類型數(shù)組的長(zhǎng)度時(shí),如果你沒(méi)有定義數(shù)組長(zhǎng)度,那么得出的結(jié)果會(huì)比實(shí)際大小大1。這是因?yàn)閟izeof吧數(shù)組結(jié)尾的\0也算了進(jìn)去。
從arr7和arr8可以看出,如果定義了數(shù)組大小,跟int類型一樣,不管怎么定義,定義了多少,結(jié)果都是你定義的那個(gè)數(shù)組大小。
從arr10可以看出,如果你輸入數(shù)組時(shí)用了大括號(hào)賦值,并且在結(jié)尾沒(méi)有手動(dòng)輸入\0,那么算出的結(jié)果就是實(shí)際賦值的個(gè)數(shù)。
總結(jié):
- 定義數(shù)組時(shí),要先明確數(shù)組的類型(int還是char或者其他類型)。
- sizeof不能用來(lái)計(jì)算已經(jīng)定義好長(zhǎng)度的數(shù)組的數(shù)組長(zhǎng)度(如int arr[10] = {0},不能有中括號(hào)里的10)。
- strlen不能用來(lái)計(jì)算int類型的數(shù)組長(zhǎng)度。
- int型計(jì)算數(shù)組長(zhǎng)度,最好用 sizeof(arr) / sizeof(arr[0]) 來(lái)計(jì)算數(shù)組長(zhǎng)度。
- char型數(shù)組如果要計(jì)算數(shù)組長(zhǎng)度,一定要用雙引號(hào)賦值。
- char型數(shù)組如果要用大括號(hào)賦值,一定要注意數(shù)組最后是否需要結(jié)束標(biāo)志 \0
到此這篇關(guān)于C語(yǔ)言數(shù)組長(zhǎng)度的計(jì)算方法的文章就介紹到這了,更多相關(guān)C語(yǔ)言數(shù)組長(zhǎng)度計(jì)算方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言中sizeof和strlen的區(qū)別詳解
- C語(yǔ)言中的strlen()和sizeof()對(duì)比分析
- C語(yǔ)言之sizeof與strlen的使用及區(qū)別
- 淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別
- 關(guān)于C語(yǔ)言strlen與sizeof區(qū)別詳情
- C語(yǔ)言中sizeof()與strlen()的區(qū)別詳解
- C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門及對(duì)比
- C語(yǔ)言中的sizeof操作符用法及和strlen的區(qū)別
- C語(yǔ)言中關(guān)于sizeof 和 strlen的區(qū)別分析
- C語(yǔ)言sizeof和strlen區(qū)別小結(jié)
相關(guān)文章
深入淺出理解C語(yǔ)言初識(shí)結(jié)構(gòu)體
C?數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是?C?編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C?的結(jié)構(gòu)體2022-02-02C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針
這篇文章主要介紹了C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Microsoft Visual C++ 6.0開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Microsoft Visual C++ 6.0開發(fā)環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決
本文主要介紹了C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C++中std::conditional的使用說(shuō)明
這篇文章主要介紹了C++中std::conditional的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題
這篇文章主要介紹了C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11給C語(yǔ)言初學(xué)者的學(xué)習(xí)建議
在本篇文章里小編給大家分享的是關(guān)于C語(yǔ)言學(xué)習(xí)建議的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2020-06-06