網(wǎng)站首頁 編程語言 正文
前言
最近在重新學(xué)習(xí)C語言,學(xué)習(xí)中發(fā)現(xiàn)之前對數(shù)組長度的計算方法模糊不清。因此做個總結(jié)。
首先要明白什么是數(shù)組。
數(shù)組是一組相同類型元素的集合。
因此,要定義一個數(shù)組,首先要確定數(shù)組內(nèi)的元素是同一種類型。
1. 數(shù)組的創(chuàng)建
首先來看看常用的數(shù)組的創(chuàng)建形式
- int型
int arr1 [10] = {0};//定義了元素個數(shù),且給第一個元素賦值為0,則其他元素均為0
通過VS調(diào)試中的監(jiān)視功能,可以看到各個數(shù)組的存放結(jié)果。
int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個數(shù),但只給前五個元素賦值,則后五個元素均為0
int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義了元素個數(shù),且給所有元素均賦值
int arr4 [10];//什么都不放,編譯器會給數(shù)組的每個元素放置隨機(jī)數(shù)。
int arr5[] = {1, 2, 3};//不定義元素個數(shù),給幾個元素賦值就有幾個元素。
注意:
如果你定義了數(shù)組的大小(也就是【】號里面寫了數(shù)字),但是沒有給任何元素賦值,那么這個數(shù)組的所有元素都默認(rèn)為一個隨機(jī)數(shù)!!!如果你定義了數(shù)組大小,但只給部分元素賦值,那么剩余元素的值默認(rèn)為0!!!(見上面arr4和arr5)。
因此常用上面arr1的方式,給int型數(shù)組的全部元素設(shè)置默認(rèn)值為0.
- char型
char arr6[] = "abc";//沒有定義元素個數(shù),用雙引號定義3個字符,末尾數(shù)組會自動加上結(jié)束標(biāo)志(\0)
char arr7 [10] = "abc";//定義10個元素個數(shù),用雙引號賦值三個字符串,其余7個元素均自動定義為\0
char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數(shù),用大括號和單引號賦值三個字符串,則數(shù)組只含有三個字符,剩余7個均為\0
char arr9 [10] = {'a', 98, '98'};//char定義數(shù)組,元素中出現(xiàn)沒有用單引號的數(shù)字,會根據(jù)ASCII碼輸出字符
char arr10[] = {'a', 'b', 'c'};//沒有定義元素個數(shù),用大括號定義字符串,數(shù)組的元素個數(shù)則只有三個,結(jié)尾沒有數(shù)組結(jié)束標(biāo)志(\0)
注意:
要格外注意舉例中arr10和arr6的不同。同樣為插入abc三個字符,但是arr6結(jié)尾有\(zhòng)0,arr10卻沒有,這在下一步求解數(shù)組長度的時候有相當(dāng)大的區(qū)別!!!
2. 求解數(shù)組的長度
求解數(shù)組長度往往要用到兩個函數(shù),strlen或者sizeof
- strlen求解數(shù)組長度
strlen是用來求一個字符串(string)的長度,因此strlen不能用來求int類型的數(shù)組長度,只能求char類型的數(shù)字長度。
具體代碼如下:
char arr6[] = "abc";//沒有定義元素個數(shù),用雙引號定義3個字符,末尾數(shù)組會自動加上結(jié)束標(biāo)志(\0)
printf("length arr6 = %d\n", strlen(arr6));
char arr7 [10] = "abc";//定義10個元素個數(shù),用雙引號賦值三個字符串,其余7個元素均自動定義為\0
printf("length arr7 = %d\n", strlen(arr7));
char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數(shù),用大括號和單引號賦值三個字符串,則數(shù)組只含有三個字符,剩余7個均為\0
printf("length arr8 = %d\n", strlen(arr8));
char arr9 [10] = {'a', 98, '98'};//char定義數(shù)組,元素中出現(xiàn)沒有用單引號的數(shù)字,會根據(jù)ASCII碼輸出字符
printf("length arr9 = %d\n", strlen(arr9));
char arr10 [] = {'a', 'b', 'c'};//沒有定義元素個數(shù),用大括號定義字符串,數(shù)組的元素個數(shù)則只有三個,結(jié)尾沒有數(shù)組結(jié)束標(biāo)志(\0)
printf("length arr10 = %d\n", strlen(arr10));
注意:
1、從arr6和arr7中可以看出,用雙引號定義的字符串?dāng)?shù)組都能正確計算出數(shù)組長度。這是因為這兩個數(shù)組的****末尾都含有結(jié)束標(biāo)志”\0“(具體看前面舉例中的截圖)。
2、另外要注意的是,arr10輸入了三個字符,但結(jié)果卻是15個,這是因為在沒有定義數(shù)組個數(shù)的時候,用大括號的形式賦值,結(jié)尾不會自動補(bǔ)充結(jié)束標(biāo)志\0,導(dǎo)致這個結(jié)果是個隨機(jī)數(shù),strlen會在內(nèi)存中一直計數(shù),知道在內(nèi)存中遇到了0才會停止技術(shù)。
但是對比arr8和arr9,也是用了大括號賦值,但結(jié)果卻是正確的,這是因為開始定義了數(shù)組的個數(shù),沒有初始化賦值的數(shù)組會默認(rèn)賦值為0(與\0有一樣的效果)。
3、如果用strlen用來求int類型數(shù)組的長度,會發(fā)現(xiàn)strlen不能用了。
int arr1 [10] = {0};//定義了元素個數(shù),且給第一個元素賦值為0,則其他元素均為0
printf("length arr1 = %d\n", strlen(arr1));
int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個數(shù),但只給前五個元素賦值,則后五個元素均為0
printf("length arr2 = %d\n", strlen(arr2));
int arr4 [10];//什么都不放,編譯器會給數(shù)組的每個元素放置隨機(jī)數(shù)。
printf("length arr4 = %d\n", strlen(arr4));
- sizeof求解數(shù)組長度
sizeof能計算變量或者數(shù)據(jù)類型所占用的內(nèi)存(以字節(jié)為單位)。用sizeof計算數(shù)組長度時,sizeof不關(guān)心數(shù)組內(nèi)部存儲的是什么類型的數(shù)據(jù)。
所以常常用 sizeof(arr)/sizeof(arr[0]) 來計算數(shù)組的長度。其中“sizeof(arr)“計算了整個數(shù)組arr占據(jù)了多少內(nèi)存(字節(jié)為單位),”sizeof(arr[0])“計算了數(shù)組中第一個元素所占多少字節(jié),兩者相除就是數(shù)組的長度。
代碼如下:
int arr1 [10] = {0};//定義了元素個數(shù),且給第一個元素賦值為0,則其他元素均為0
int arr2 [10] = {1, 2, 3, 4, 5};//定義了元素個數(shù),但只給前五個元素賦值,則后五個元素均為0
int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定義了元素個數(shù),且給所有元素均賦值
int arr4 [10];//什么都不放,編譯器會給數(shù)組的每個元素放置隨機(jī)數(shù)。
int arr5[] = {1, 2, 3};//不定義元素個數(shù),給幾個元素賦值就有幾個元素。
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ù)組的大小,那么不管你插入多少個元素,求出來的結(jié)果永遠(yuǎn)是你定義的數(shù)組大小。
如果你沒有定義數(shù)組大小,那么算出來的就是你實際賦值的數(shù)組大小。
char arr6 [] = "abc";//沒有定義元素個數(shù),用雙引號定義3個字符,末尾數(shù)組會自動加上結(jié)束標(biāo)志(\0)
char arr7 [10] = "abc";//定義10個元素個數(shù),用雙引號賦值三個字符串,其余7個元素均自動定義為\0
char arr8 [10] = {'a', 'b', 'c'};//定義10個元素個數(shù),用大括號和單引號賦值三個字符串,則數(shù)組只含有三個字符,剩余7個均為\0
char arr10 [] = {'a', 'b', 'c'};//沒有定義元素個數(shù),用大括號定義字符串,數(shù)組的元素個數(shù)則只有三個,結(jié)尾沒有數(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ù)組的長度時,如果你沒有定義數(shù)組長度,那么得出的結(jié)果會比實際大小大1。這是因為sizeof吧數(shù)組結(jié)尾的\0也算了進(jìn)去。
從arr7和arr8可以看出,如果定義了數(shù)組大小,跟int類型一樣,不管怎么定義,定義了多少,結(jié)果都是你定義的那個數(shù)組大小。
從arr10可以看出,如果你輸入數(shù)組時用了大括號賦值,并且在結(jié)尾沒有手動輸入\0,那么算出的結(jié)果就是實際賦值的個數(shù)。
總結(jié):
- 定義數(shù)組時,要先明確數(shù)組的類型(int還是char或者其他類型)。
- sizeof不能用來計算已經(jīng)定義好長度的數(shù)組的數(shù)組長度(如int arr[10] = {0},不能有中括號里的10)。
- strlen不能用來計算int類型的數(shù)組長度。
- int型計算數(shù)組長度,最好用 sizeof(arr) / sizeof(arr[0]) 來計算數(shù)組長度。
- char型數(shù)組如果要計算數(shù)組長度,一定要用雙引號賦值。
- char型數(shù)組如果要用大括號賦值,一定要注意數(shù)組最后是否需要結(jié)束標(biāo)志 \0
原文鏈接:https://blog.csdn.net/ImwaterP/article/details/119140242
相關(guān)推薦
- 2022-08-23 一文教會你調(diào)整Matplotlib子圖的大小_python
- 2021-12-07 Centos8搭建基于kdc加密的nfs_Linux
- 2022-02-11 ES6的Promise用法詳解_基礎(chǔ)知識
- 2022-10-27 樹莓派-關(guān)閉可視化界面
- 2022-10-31 解決Python3中二叉樹前序遍歷的迭代問題_python
- 2022-06-12 Python裝飾器的定義和使用詳情_python
- 2022-06-01 利用Python實現(xiàn)外觀數(shù)列求解_python
- 2023-03-30 C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進(jìn)行排序的實現(xiàn)過程探究_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支