C語(yǔ)言基礎(chǔ)(六)數(shù)組相關(guān)
一、為什么需要數(shù)組在編程中我們經(jīng)常需要處理多個(gè)相同類型的數(shù)據(jù)。比如存儲(chǔ)10個(gè)學(xué)生的成績(jī)?nèi)绻挥脭?shù)組就得定義10個(gè)單獨(dú)的變量score1,score2, …不僅麻煩而且無(wú)法用循環(huán)統(tǒng)一處理。數(shù)組正是為了解決這類問(wèn)題而生的——它能在內(nèi)存中連續(xù)存儲(chǔ)多個(gè)相同類型的數(shù)據(jù)并通過(guò)下標(biāo)快速訪問(wèn)每個(gè)元素。二、一維數(shù)組基礎(chǔ)1. 數(shù)組的定義語(yǔ)法格式類型說(shuō)明符 數(shù)組名[常量表達(dá)式];例如inta[10];// 定義一個(gè)包含10個(gè)int元素的數(shù)組charstr[32];// 定義包含32個(gè)char元素的數(shù)組floatarray[5];// 定義包含5個(gè)float元素的數(shù)組類型說(shuō)明符可以是基本數(shù)據(jù)類型int、char、float等也可以是構(gòu)造類型但不能是void。數(shù)組名遵循標(biāo)識(shí)符命名規(guī)則字母、數(shù)字、下劃線數(shù)字不能開頭。常量表達(dá)式表示數(shù)組元素個(gè)數(shù)必須是編譯時(shí)確定的常量不能是變量。2. 數(shù)組元素的訪問(wèn)通過(guò)數(shù)組名[下標(biāo)]訪問(wèn)元素下標(biāo)從0開始到元素個(gè)數(shù)-1結(jié)束。a[0]10;// 給第一個(gè)元素賦值a[5]99;// 給第六個(gè)元素賦值printf(%d,a[0]);// 輸出第一個(gè)元素注意下標(biāo)可以是常量、變量或表達(dá)式結(jié)果必須為整型。訪問(wèn)時(shí)不要超出范圍否則會(huì)越界訪問(wèn)可能導(dǎo)致程序崩潰或數(shù)據(jù)錯(cuò)亂。3. 數(shù)組的初始化初始化即在定義時(shí)給元素賦初值。全部初始化inta[5]{1,2,3,4,5};局部初始化未初始化的元素自動(dòng)為0inta[5]{1,2,3};// 前三個(gè)為1,2,3后兩個(gè)為0初始化全0inta[5]{0};// 所有元素為0inta[5]{0,0,0,0,0};省略數(shù)組大小必須初始化inta[]{1,2,3,4,5};// 編譯器自動(dòng)確定大小為5重要如果不初始化數(shù)組元素的值是隨機(jī)的內(nèi)存中遺留的值所以定義時(shí)盡量初始化哪怕只是{0}。4. 數(shù)組的存儲(chǔ)特性單一性所有元素類型相同。有序性元素按下標(biāo)從0到N-1順序存儲(chǔ)。連續(xù)性數(shù)組占用一塊連續(xù)的內(nèi)存空間。這一點(diǎn)非常重要因?yàn)檫B續(xù)存儲(chǔ)使得我們可以通過(guò)指針和偏移量快速訪問(wèn)也是數(shù)組效率高的原因。三、數(shù)組的經(jīng)典應(yīng)用排序排序是數(shù)組的典型應(yīng)用。這里以選擇排序?yàn)槔莆掌渌枷?。選擇排序升序每次從待排序位置開始往后找到最小值放到當(dāng)前位置。inta[10]{1,2,-3,-4,-5,6,7,8,-9,0};intlensizeof(a)/sizeof(a[0]);// 計(jì)算元素個(gè)數(shù)for(inti0;ilen-1;i){for(intji1;jlen;j){if(a[i]a[j]){// 升序如果前面大于后面交換inttmpa[i];a[i]a[j];a[j]tmp;}}}時(shí)間復(fù)雜度O(n2)空間復(fù)雜度O(1)。選擇排序是不穩(wěn)定的相同元素相對(duì)順序可能改變。四、字符型數(shù)組字符串C語(yǔ)言沒(méi)有專門的字符串類型而是用字符數(shù)組來(lái)存儲(chǔ)字符串并以\0ASCII碼0作為結(jié)束標(biāo)志。1. 定義與初始化charstr[32];charstr[32]{h,e,l,l,o};// 不推薦未初始化部分為0charstr[32]{hello};// 推薦charstr[32]hello;// 最常用charstr[]hello;// 自動(dòng)確定大小為6包含\0注意hello實(shí)際占6個(gè)字節(jié)5個(gè)字符 1個(gè)\0。2. 輸入與輸出輸出可以使用printf(%s, str)或puts(str)自動(dòng)換行。輸入可以使用scanf(%s, str)遇空格或Tab停止或gets(str)遇換行停止但危險(xiǎn)可能越界。charstr[100]{0};scanf(%s,str);// 輸入 hello world 只讀入 hellogets(str);// 可讀入帶空格的字符串但存在越界風(fēng)險(xiǎn)3. 常用字符串操作函數(shù)手寫實(shí)現(xiàn)雖然標(biāo)準(zhǔn)庫(kù)提供了strlen、strcpy、strcat等但理解其底層實(shí)現(xiàn)至關(guān)重要。① 求字符串長(zhǎng)度 (strlen)統(tǒng)計(jì)有效字符個(gè)數(shù)不包括\0。intmy_strlen(constchar*s){intlen0;while(s[len]!\0){len;}returnlen;}② 字符串拷貝 (strcpy)將源字符串復(fù)制到目標(biāo)數(shù)組目標(biāo)數(shù)組空間要足夠。voidmy_strcpy(char*dst,constchar*src){inti0;while(src[i]!\0){dst[i]src[i];i;}dst[i]\0;// 別忘了結(jié)束標(biāo)志}③ 字符串拼接 (strcat)將源字符串追加到目標(biāo)字符串末尾。voidmy_strcat(char*dst,constchar*src){inti0,j0;while(dst[i]!\0)i;// 找到dst的末尾while(src[j]!\0){dst[i]src[j];i;j;}dst[i]\0;}五、二維數(shù)組二維數(shù)組可以理解為“數(shù)組的數(shù)組”常用于存儲(chǔ)矩陣或表格數(shù)據(jù)。1. 定義與訪問(wèn)inta[3][4];// 3行4列共12個(gè)元素訪問(wèn)方式a[行下標(biāo)][列下標(biāo)]行下標(biāo)范圍02列下標(biāo)03。2. 初始化全部初始化分行或不分行inta[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};// 可省略行數(shù)inta[3][4]{1,2,3,4,5,6,7,8,9,10,11,12};// 自動(dòng)按行填充局部初始化未初始化的補(bǔ)0inta[3][4]{{1,2},{3,4,5},{6}};// 第一行1,2,0,0第二行3,4,5,0第三行6,0,0,0注意在初始化時(shí)行數(shù)可以省略但列數(shù)不能省略。3. 二維字符型數(shù)組用于存儲(chǔ)多個(gè)字符串如學(xué)生名單。charstr[3][100]{0};// 3個(gè)字符串每個(gè)最長(zhǎng)99字符charstr[3][100]{hello,world,how};輸入輸出時(shí)用gets(str[i])或scanf(%s, str[i])循環(huán)處理每一行。六、易錯(cuò)點(diǎn)與最佳實(shí)踐越界訪問(wèn)下標(biāo)超出范圍不會(huì)報(bào)錯(cuò)但會(huì)破壞內(nèi)存數(shù)據(jù)務(wù)必確保下標(biāo)在合法范圍內(nèi)。忘記\0結(jié)束符字符數(shù)組作為字符串使用時(shí)必須保證有\(zhòng)0否則輸出會(huì)亂碼。sizeof與strlen的區(qū)別sizeof是運(yùn)算符計(jì)算數(shù)組占用的總字節(jié)數(shù)包括\0。strlen是函數(shù)計(jì)算字符串有效字符個(gè)數(shù)不含\0。數(shù)組名是地址常量不能對(duì)數(shù)組名賦值如str hello是錯(cuò)誤的。盡量避免使用gets推薦fgets或scanf配合寬度限制。

相關(guān)新聞

AI寫作合規(guī)指南:原創(chuàng)邊界與內(nèi)容優(yōu)化策略

AI寫作合規(guī)指南:原創(chuàng)邊界與內(nèi)容優(yōu)化策略

1. AI寫作的合規(guī)邊界與價(jià)值定位最近兩年,內(nèi)容創(chuàng)作者們對(duì)AI寫作工具的態(tài)度經(jīng)歷了從質(zhì)疑到接納的轉(zhuǎn)變過(guò)程。我運(yùn)營(yíng)的科技類訂閱號(hào)在過(guò)去半年里,有超過(guò)60%的原創(chuàng)內(nèi)容都不同程度地使用了AI輔助創(chuàng)作。但直到現(xiàn)在,仍有很多同行在后臺(tái)私信問(wèn)我&#…

2026/7/31 4:04:55 閱讀更多
Prompt Caching優(yōu)化大模型推理:原理與實(shí)踐

Prompt Caching優(yōu)化大模型推理:原理與實(shí)踐

1. Prompt Caching技術(shù)概述在大語(yǔ)言模型(LLM)推理過(guò)程中,計(jì)算資源消耗主要來(lái)自兩個(gè)部分:處理用戶輸入的prompt階段和生成回復(fù)的decoding階段。傳統(tǒng)KV Cache技術(shù)通過(guò)緩存attention層的Key-Value矩陣來(lái)優(yōu)化decoding階段的重復(fù)計(jì)算,而Prompt Cac…

2026/7/31 4:04:55 閱讀更多
STM32 GPIO深度解析:從八種工作模式到標(biāo)準(zhǔn)庫(kù)實(shí)戰(zhàn)與避坑指南

STM32 GPIO深度解析:從八種工作模式到標(biāo)準(zhǔn)庫(kù)實(shí)戰(zhàn)與避坑指南

1. 從零開始:為什么GPIO是STM32的“第一課”? 如果你剛拿到一塊STM32開發(fā)板,點(diǎn)亮第一個(gè)LED燈,或者讀取第一個(gè)按鍵狀態(tài),這幾乎是你與這片芯片的第一次“對(duì)話”。而完成這次對(duì)話的“翻譯官”,就是GPIO。對(duì)于所…

2026/7/31 3:54:55 閱讀更多
DDD 架構(gòu)實(shí)戰(zhàn)案例:大型婚嫁連鎖中臺(tái)的數(shù)據(jù)防漏與領(lǐng)域解耦

DDD 架構(gòu)實(shí)戰(zhàn)案例:大型婚嫁連鎖中臺(tái)的數(shù)據(jù)防漏與領(lǐng)域解耦

在服務(wù)于大型婚慶策劃與影樓連鎖的系統(tǒng)中,隨著業(yè)務(wù)規(guī)模的擴(kuò)張,早期“快跑”階段留下的 CRUD 系統(tǒng)必然面臨兩大生死考驗(yàn):一是多角色、長(zhǎng)生命周期的訂單流轉(zhuǎn)導(dǎo)致代碼邏輯極度耦合(大泥球);二是系統(tǒng)權(quán)限粗放導(dǎo)致的客源泄露和員工飛單。本文將深度…

2026/7/31 5:04:57 閱讀更多
構(gòu)建Fiddler與Burp Suite移動(dòng)端流量分析矩陣:安卓應(yīng)用安全測(cè)試與調(diào)試實(shí)戰(zhàn)

構(gòu)建Fiddler與Burp Suite移動(dòng)端流量分析矩陣:安卓應(yīng)用安全測(cè)試與調(diào)試實(shí)戰(zhàn)

1. 項(xiàng)目概述:為什么需要移動(dòng)端流量分析矩陣?在移動(dòng)應(yīng)用安全評(píng)估和日常開發(fā)調(diào)試中,流量分析是洞察應(yīng)用行為、發(fā)現(xiàn)潛在漏洞、優(yōu)化網(wǎng)絡(luò)性能的核心手段。很多開發(fā)者或安全研究員習(xí)慣單獨(dú)使用Fiddler或Burp Suite,但這兩款工具各有側(cè)重…

2026/7/31 5:04:57 閱讀更多
STM32 IAP實(shí)戰(zhàn):從原理到穩(wěn)定實(shí)現(xiàn)的遠(yuǎn)程固件升級(jí)方案

STM32 IAP實(shí)戰(zhàn):從原理到穩(wěn)定實(shí)現(xiàn)的遠(yuǎn)程固件升級(jí)方案

1. 項(xiàng)目概述:為什么我們需要IAP?在嵌入式產(chǎn)品開發(fā)中,尤其是那些部署在遠(yuǎn)端、難以物理接觸的設(shè)備,固件升級(jí)一直是個(gè)頭疼的問(wèn)題。想象一下,一個(gè)安裝在幾十米高塔上的氣象監(jiān)測(cè)儀,或者一個(gè)嵌入在生產(chǎn)線深處的控…

2026/7/31 5:04:57 閱讀更多
高效團(tuán)隊(duì)建設(shè)的核心要素與實(shí)踐方法

高效團(tuán)隊(duì)建設(shè)的核心要素與實(shí)踐方法

1. 團(tuán)隊(duì)建設(shè)的核心價(jià)值與挑戰(zhàn)在當(dāng)今快節(jié)奏的工作環(huán)境中,團(tuán)隊(duì)建設(shè)已經(jīng)從"可有可無(wú)"的軟技能變成了決定項(xiàng)目成敗的關(guān)鍵因素。我經(jīng)歷過(guò)太多這樣的場(chǎng)景:一群技術(shù)大牛組成的團(tuán)隊(duì),因?yàn)槿狈τ行f(xié)作,最終交付成果遠(yuǎn)低于預(yù)期&am…

2026/7/31 5:04:57 閱讀更多
大模型架構(gòu)設(shè)計(jì):主流方案與實(shí)戰(zhàn)指南

大模型架構(gòu)設(shè)計(jì):主流方案與實(shí)戰(zhàn)指南

1. 大模型架構(gòu)設(shè)計(jì)全景概覽最近兩年,大模型架構(gòu)設(shè)計(jì)領(lǐng)域呈現(xiàn)出百花齊放的態(tài)勢(shì)。從DeepSeek R1到Kimi K2,各家機(jī)構(gòu)都在探索最適合自身業(yè)務(wù)場(chǎng)景和技術(shù)路線的架構(gòu)方案。作為一名長(zhǎng)期跟蹤大模型技術(shù)演進(jìn)的從業(yè)者,我發(fā)現(xiàn)當(dāng)前主流架構(gòu)已經(jīng)形成了幾個(gè)…

2026/7/31 5:04:57 閱讀更多
TTL與CMOS電平詳解:從原理到實(shí)戰(zhàn),解決嵌入式通信接口兼容性問(wèn)題

TTL與CMOS電平詳解:從原理到實(shí)戰(zhàn),解決嵌入式通信接口兼容性問(wèn)題

1. 從一次串口通信的“詭異”故障說(shuō)起前段時(shí)間,我?guī)鸵粋€(gè)剛?cè)胄械挠布こ處熍笥雅挪橐粋€(gè)串口通信的問(wèn)題。他的單片機(jī)(STM32)和另一個(gè)模塊通過(guò)串口連接,距離不到10厘米,但通信就是不穩(wěn)定,時(shí)而能收到數(shù)據(jù)&…

2026/7/31 4:54:56 閱讀更多
HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

第五季 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn) ——從USB-HART Modem抓包到工程診斷:讓協(xié)議知識(shí)變成維修能力 各位工業(yè)現(xiàn)場(chǎng)的工程師朋友們,大家好! 經(jīng)過(guò)前四季的系統(tǒng)學(xué)習(xí),我們已經(jīng)構(gòu)建了HART協(xié)議的完整理論框架: 第一季:六層生命模型與本質(zhì)認(rèn)知 第二季:物理層4–20mA與FSK魔法 第三季:數(shù)…

2026/7/31 0:14:40 閱讀更多
維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

第二篇:探頭地線——示波器最大的“坑” ——那根不起眼的小地線,可能比你測(cè)的信號(hào)還重要 很多工程師第一次用示波器時(shí),都會(huì)經(jīng)歷這樣一個(gè)“驚魂”時(shí)刻。 某食品廠包裝線,伺服偶發(fā)報(bào)警。年輕工程師判斷是編碼器信號(hào)受干擾,便拿出示波器認(rèn)真測(cè)量。波形一出來(lái),所有人都倒…

2026/7/31 0:14:40 閱讀更多
SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢深度解析與實(shí)戰(zhàn)指南

SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢深度解析與實(shí)戰(zhàn)指南

1. 項(xiàng)目概述:為什么科目余額查詢是SAP財(cái)務(wù)的“定盤星”?干了十幾年SAP財(cái)務(wù)顧問(wèn),我見(jiàn)過(guò)太多剛?cè)胄械呐笥?amp;#xff0c;一上來(lái)就急著學(xué)復(fù)雜的憑證過(guò)賬、月結(jié)流程,結(jié)果在第一個(gè)月結(jié)日就卡殼了。老板問(wèn)“這個(gè)月利潤(rùn)多少?”&…

2026/7/31 0:14:40 閱讀更多