




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、傳智播客 C 提高講義傳智掃地僧1 程序內(nèi)存模型1.1 就業(yè)班引言1.1.1 問(wèn)題引出企業(yè)需要 能干活的人? C學(xué)到什么程度可以 找工作 ?? 對(duì)于 C/C+初級(jí)開(kāi)發(fā)者,怎么達(dá)到 企業(yè)的用人標(biāo)準(zhǔn)? 就業(yè)問(wèn)題問(wèn): 老師,有沒(méi)有一個(gè) 框框 ?有沒(méi)有一個(gè) 標(biāo)準(zhǔn) ???我們學(xué)什么哪?C工程開(kāi)發(fā)需要什么(培養(yǎng)什么能力)成熟的、商業(yè)化的信息系統(tǒng)在分區(qū)、分層 信息系統(tǒng)的技術(shù)模型在分層 找出對(duì)我們初學(xué)者最近的那一層(哪些能力是你 入行前 ,必須要掌握的)C項(xiàng)目開(kāi)發(fā)的套路(一套接口)? /socket_client pool api 設(shè)計(jì)與實(shí)現(xiàn)? int sckClient_poolinit(void *hand
2、le);? int sckClient_getConnet(void *handle, void *hConnect);? int sckClient_sendData(void *hConnect, unsigned char *data, int dataLen);? int sckClient_getData(void *hConnect, unsigned char *data, int *dataLen);? int sckClient_getData_Free(void *hConnect, unsigned char *data);int sckClient_putConnet(
3、void *handle, void *hConnect); int sckClient_pooldestory(void *handle);總結(jié):尋找到學(xué)習(xí)的標(biāo)準(zhǔn)培養(yǎng)兩種能力? 接口的封裝和設(shè)計(jì)(功能抽象和封裝)? 接口 api 的使用能力? 接口 api 的查找能力(快速上手)? 接口 api 的實(shí)現(xiàn)能力? 建立正確程序運(yùn)行內(nèi)存布局圖(印象圖)? 內(nèi)存四區(qū)模型圖? 函數(shù)調(diào)用模型圖1.1.2 總體課程安排課程大綱? C 提高? C+? 數(shù)據(jù)結(jié)構(gòu)? 總體時(shí)間 1 個(gè)月實(shí)用專題? 總:輕松入門 實(shí)戰(zhàn)應(yīng)用? 形式 1 :專題的形式錄制 話題集中 便于初學(xué)者學(xué)習(xí)? 形式 2 :知識(shí)點(diǎn)分段錄制、細(xì)致講
4、解,從根本上提高初學(xué)者水平 ? 項(xiàng)目開(kāi)發(fā)中的重要點(diǎn)做剖析? 指針鐵律 1 2 3 4 5 6 7 8 9 10= 企業(yè)用人標(biāo)準(zhǔn)1.1.3 學(xué)員要求? 資料,時(shí)間空間管理? 工作經(jīng)驗(yàn),記錄和積累? 臨界點(diǎn)? 事物認(rèn)知規(guī)律? 挑戰(zhàn) *p ,*p, *p? 提高課堂效率? 課堂例子,當(dāng)堂運(yùn)行。? 錄制視頻說(shuō)明(不來(lái),看視頻)? C/C+學(xué)習(xí)特點(diǎn)? Java:學(xué)習(xí)、應(yīng)用、做項(xiàng)目? C:學(xué)習(xí)、 理解、 應(yīng)用、做項(xiàng)目? 多動(dòng)手? 不動(dòng)手,永遠(yuǎn)學(xué)不會(huì)? 關(guān)鍵點(diǎn)、關(guān)鍵時(shí)候,進(jìn)行 強(qiáng)化訓(xùn)練和考試1.1.4 小結(jié)? 建立信心? 接口的封裝和設(shè)計(jì)? 指針教學(xué),多年實(shí)踐檢驗(yàn)? 心態(tài)放輕松了? 分析有效時(shí)間? 尊重事物
5、認(rèn)知規(guī)律、給自己一次機(jī)會(huì)1.2 學(xué)員聽(tīng)課的標(biāo)準(zhǔn)C語(yǔ)言學(xué)到什么程度 ,就可以聽(tīng)懂傳智播客就業(yè)班 第一階段 的課程了 有沒(méi)有一個(gè)標(biāo)準(zhǔn)?? 選擇法或者冒泡法排序? 在一個(gè)函數(shù)內(nèi)排序? 通過(guò)函數(shù)調(diào)用的方式排序? 數(shù)組做函數(shù)參數(shù)的技術(shù)盲點(diǎn)和推演1.3 內(nèi)存四區(qū)專題講座1.3.1 數(shù)據(jù)類型本質(zhì)分析數(shù)據(jù)類型概念? “類型”是對(duì)數(shù)據(jù)的抽象? 類型相同的數(shù)據(jù)有相同的表示形式、存儲(chǔ)格式以及相關(guān)的操作? 程序中使用的所有數(shù)據(jù)都必定屬于某一種數(shù)據(jù)類型數(shù)據(jù)類型的本質(zhì)思考? 思考數(shù)據(jù)類型和內(nèi)存有關(guān)系嗎?? C/C+為什么會(huì)引入數(shù)據(jù)類型?數(shù)據(jù)類型的本質(zhì)? 數(shù)據(jù)類型可理解為創(chuàng)建變量的模具(模子) ;是固定內(nèi)存大小的別名? 數(shù)
6、據(jù)類型的作用:編譯器預(yù)算對(duì)象(變量)分配的內(nèi)存空間大小? 程序舉例,如何求數(shù)據(jù)類型的大小 sizeof(int *)? 請(qǐng)問(wèn):數(shù)據(jù)類型可以有別名嗎?數(shù)據(jù)類型可以自定義嗎?數(shù)據(jù)類型大小int main()int a = 10;int b10 ;printf(int a:%d n, sizeof(a);printf(int a:%d n, sizeof(int *); printf(int b:%d n, sizeof(b); printf(int b:%d n, sizeof(b0); printf(int b:%d n, sizeof(*b); printf(hellon);getchar()
7、; return 0;sizeof 是操作符,不是函數(shù); sizeof 測(cè)量的實(shí)體大小為編譯期間就已確定數(shù)據(jù)類型別名? 數(shù)據(jù)類型可以理解為固定大小內(nèi)存塊的別名,請(qǐng)問(wèn)數(shù)據(jù)類型可以起別名嗎? int main()/Teacher t1;printf(Teacher:%d n, sizeof(Teacher);printf(u32:%d n, sizeof(u32);printf(u8:%d n, sizeof(u8);printf(hellon);getchar();return 0;數(shù)據(jù)類型的封裝? 1、void 的字面意思是“無(wú)類型” ,void * 則為“無(wú)類型指針”, void * 可以
8、指向任何類型的數(shù)據(jù)。? 2 、用法 1 :數(shù)據(jù)類型的封裝int InitHardEnv(void *handle);典型的如內(nèi)存操作函數(shù) memcpy 和 memset 的函數(shù)原型分別為void * memcpy(void *dest, const void *src, size_t len);void * memset ( void * buffer, int c, size_t num );? 3 、用法 2 : void 修飾函數(shù)返回值和參數(shù),僅表示無(wú)。如果函數(shù)沒(méi)有返回值,那么應(yīng)該將其聲明為 void 型 如果函數(shù)沒(méi)有參數(shù),應(yīng)該聲明其參數(shù)為 void int function(void)
9、return 1;? 4、 void 指針的意義C語(yǔ)言規(guī)定只有相同類型的指針才可以相互賦值 void*指針作為左值用于“接收”任意類型的指針 void*指針作為右值賦值給其它指針時(shí)需要強(qiáng)制類型轉(zhuǎn)換 int *p1 = NULL;char *p2 = (char *)malloc(sizoeof(char)*20);? 5 、不存在 void 類型的變量C 語(yǔ)言沒(méi)有定義 void 究竟是多大內(nèi)存的別名? 6 、擴(kuò)展閱讀 void 類型詳解 .doc數(shù)據(jù)類型總結(jié)與擴(kuò)展? 1 、數(shù)據(jù)類型本質(zhì)是固定內(nèi)存大小的別名;是個(gè)模具, c 語(yǔ)言規(guī)定:通過(guò) 數(shù)據(jù)類型定義變量。? 2 、數(shù)據(jù)類型大小計(jì)算( size
10、of)? 3 、可以給已存在的數(shù)據(jù)類型起別名 typedef? 4 、數(shù)據(jù)類型封裝概念( void 萬(wàn)能類型) 思考 1:C 一維數(shù)組、二維數(shù)組有數(shù)據(jù)類型嗎? int array10 。 若有,數(shù)組類型又如何表達(dá)?又如定義? 若沒(méi)有,也請(qǐng)說(shuō)明原因。拋磚:數(shù)組類型,壓死初學(xué)者的三座大山1、數(shù)組類型2、數(shù)組指針3、數(shù)組類型和數(shù)組指針的關(guān)系 思考 2:C語(yǔ)言中,函數(shù)是可以看做一種數(shù)據(jù)類型嗎?a) 若是,請(qǐng)說(shuō)明原因并進(jìn)一步思考:函數(shù)這種數(shù)據(jù)類型,能再重定義嗎?b)若不是,也請(qǐng)說(shuō)明原因 拋磚:1.3.2 變量本質(zhì)分析變量概念概念:既能讀又能寫的內(nèi)存對(duì)象,稱為變量;若一旦初始化后不能修改的對(duì)象則稱為常量。
11、變量定義形式:類型 標(biāo)識(shí)符 , 標(biāo)識(shí)符 , 標(biāo) , 識(shí)符 ;例如:int x ;int wordCut , Radius , HeightdoubleFlightTime , Mileage , Speed ;變量本質(zhì)1、程序通過(guò)變量來(lái)申請(qǐng)和命名內(nèi)存空間 int a = 02、通過(guò)變量名訪問(wèn)內(nèi)存空間 (一段連續(xù))內(nèi)存空間的別名(是一個(gè)門牌號(hào))3、修改變量有幾種方法?1、直接2、間接。內(nèi)存有地址編號(hào),拿到地址編號(hào)也可以修改內(nèi)存;于是橫空出世 了?。ň幊贪咐?、內(nèi)存空間可以再取給別名嗎?4、數(shù)據(jù)類型和變量的關(guān)系? 通過(guò)數(shù)據(jù)類型定義變量5、總結(jié)及思考題1 對(duì)內(nèi)存,可讀可寫;2 通過(guò)變量往內(nèi)存讀寫數(shù)
12、據(jù); 3 不是向變量讀寫數(shù)據(jù), 而是向變量所代表的內(nèi)存空間中寫數(shù)據(jù)。問(wèn): 變量跑哪去了? 思考 1:變量三要素 (名稱、大小、作用域 ),變量的生命周期? 思考 2:C+編譯器是如何管理函數(shù) 1,函數(shù) 2 變量之間的關(guān)系的? =引出兩個(gè)重要話題:內(nèi)存四區(qū)模型函數(shù)調(diào)用模型重要實(shí)驗(yàn):int main333()/2 種方法,通過(guò)變量直接操作內(nèi)存/ 通過(guò)內(nèi)存編號(hào)操作內(nèi)存int i = 0;printf(&i:%dn, &i);*(int *)(1245024) = 10; printf(i:%d, i);printf(hellon);getchar();return 0;1.3.3 程序的內(nèi)存四區(qū)模型
13、內(nèi)存四區(qū)的建立流程流程說(shuō)明1、操作系統(tǒng)把物理硬盤代碼 load 到內(nèi)存2、操作系統(tǒng)把 c 代碼分成四個(gè)區(qū)3、操作系統(tǒng)找到 main 函數(shù)入口執(zhí)行各區(qū)元素分析1.4 函數(shù)調(diào)用模型1.4.1 基本原理1.4.2 內(nèi)存四區(qū)模型和函數(shù)調(diào)用模型變量傳遞分析1、一個(gè)主程序有 n 函數(shù)組成, c+編譯器會(huì)建立有幾個(gè)堆區(qū)?有幾個(gè)棧區(qū)? 2、函數(shù)嵌套調(diào)用時(shí),實(shí)參地址傳給形參后,C+編譯器如何管理變量的生命周期?分析:函數(shù) A,調(diào)用函數(shù) B,通過(guò)參數(shù)傳遞的變量(內(nèi)存空間能用嗎?)1.4.3 提示學(xué)好 C 語(yǔ)言的關(guān)鍵1.4.4 如何建立正確的程序運(yùn)行內(nèi)存布局圖? 內(nèi)存四區(qū)模型 & 函數(shù)調(diào)用模型? 函數(shù)內(nèi)元素? 深入
14、理解數(shù)據(jù)類型和變量“內(nèi)存”屬性? 一級(jí)指針內(nèi)存布局圖 (int *,char*)? 二級(jí)指針內(nèi)存布局圖 (int * char *)? 函數(shù)間? 主調(diào)函數(shù)分配內(nèi)存,還是被調(diào)用函數(shù)分配內(nèi)存? 主調(diào)函數(shù)如何使用被調(diào)用函數(shù)分配的內(nèi)存 (技術(shù)關(guān)鍵點(diǎn): 指針做函 數(shù)參數(shù))=學(xué)習(xí)指針的技術(shù)路線圖1.5 內(nèi)存四區(qū)強(qiáng)化訓(xùn)練01 全局區(qū)訓(xùn)練? char *p1= “ abcdefg ”;02 堆棧區(qū)生命周期訓(xùn)練? Char p1= “ abcdefg ”;? 返回基本類型? 返回非基本類型03 堆棧屬性訓(xùn)練? 測(cè)試 heap 生長(zhǎng)方向? 測(cè)試 stack 生長(zhǎng)方向? Heap、stack 生長(zhǎng)方向和內(nèi)存存放方向
15、是兩個(gè)不同概念? 野指針? Malloc 得到指針釋放問(wèn)題測(cè)試? free(p)? free(p+1),深入理解1.6 作業(yè)強(qiáng)化訓(xùn)練 1 劃出內(nèi)存四區(qū)void main26()char buf100;/byte b1 = new byte100;int a = 10; / 分配 4 個(gè)字節(jié)的內(nèi)存 棧區(qū)也叫臨時(shí)區(qū)int *p;/ 分配 4 個(gè)字節(jié)的內(nèi)存p = &a; /cpu 執(zhí)行的代碼,放在代碼區(qū)*p = 20; /char *p = NULL; /分配 4 個(gè)字節(jié)的內(nèi)存 棧區(qū)也叫臨時(shí)區(qū) p = (char *)malloc(100); / 內(nèi)存泄露概念 if (p != NULL)free(
16、p);system(pause);全局區(qū)代碼測(cè)試char * getstring1()char *p1 = abcde;return p1;char * getstring2()char *p2 = abcde;return p2;void main()int i= 0;/ 指針指向誰(shuí)就把誰(shuí)的地址賦給指針變量。char *p1 = getstring1();char *p2 = getstring2();char *p3 = NULL; /p3 是個(gè)變量/ 指針變量和它所執(zhí)行的內(nèi)存空間變量是兩個(gè)不同的概念strcmp(p1, p2);system(pause);訓(xùn)練 2 劃出內(nèi)存四區(qū)void
17、main01()char buf100;/byte b1 = new byte100;int a = 10; / 分配 4 個(gè)字節(jié)的內(nèi)存 棧區(qū)也叫臨時(shí)區(qū)int *p;/ 分配 4 個(gè)字節(jié)的內(nèi)存p = &a; /cpu 執(zhí)行的代碼,放在代碼區(qū)*p = 20; /char *p2 = NULL; /分配 4 個(gè)字節(jié)的內(nèi)存 棧區(qū)也叫臨時(shí)區(qū)p2 = (char *)malloc(100); / 內(nèi)存泄露概念if (p2 != NULL)free(p2);/p2 = NULL; 若不寫,實(shí)驗(yàn)效果 ,分析原因if (p2 != NULL)free(p2);system(pause);2 指針知識(shí)體系搭建2
18、.1 前言先從整體上把握指針的知識(shí)體系。然后突破 1 級(jí)指針、二級(jí)指針、多級(jí)指針。2.2 指針強(qiáng)化鐵律 1:指針是一種數(shù)據(jù)類型1)指針也是一種變量,占有內(nèi)存空間,用來(lái)保存內(nèi)存地址測(cè)試指針變量占有內(nèi)存空間大小2)*p 操作內(nèi)存在指針聲明時(shí), * 號(hào)表示所聲明的變量為指針在指針使用時(shí), * 號(hào)表示 操作 指針?biāo)赶虻膬?nèi)存空間中的值*p 相當(dāng)于通過(guò)地址 (p 變量的值 ) 找到一塊內(nèi)存;然后操作內(nèi)存*p 放在等號(hào)的左邊賦值(給內(nèi)存賦值)*p 放在等號(hào)的右邊取值(從內(nèi)存獲取值)3)指針變量和它指向的內(nèi)存塊是兩個(gè)不同的概念/ 含義 1 給 p 賦值 p=0x1111; 只會(huì)改變指針變量值, 不會(huì)改變所指
19、的內(nèi)容; p = p +1;/p+/ 含義 2 給*p 賦值 *p=a; 不會(huì)改變指針變量的值,只會(huì)改變所指的內(nèi)存塊的值/ 含義 3 =左邊 *p 表示 給內(nèi)存賦值, =右邊 *p 表示取值 含義不同切結(jié)!/ 含義 4 =左邊 char *p/ 含義 5 保證所指的內(nèi)存塊能修改4)指針是一種數(shù)據(jù)類型,是指它指向的內(nèi)存空間的數(shù)據(jù)類型含義 1:指針步長(zhǎng)( p+),根據(jù)所致內(nèi)存空間的數(shù)據(jù)類型來(lái)確定 p+= (unsigned char )p+sizeof(a); 結(jié)論:指針的步長(zhǎng),根據(jù)所指內(nèi)存空間類型來(lái)定。注意: 建立指針指向誰(shuí),就把把誰(shuí)的地址賦值給指針。圖和代碼和二為一。 不斷的給指針變量賦值,
20、就是不斷的改變指針變量 (和所指向內(nèi)存空間沒(méi)有任何關(guān) 系)。鐵律 2:間接賦值( *p )是指針存在的最大意義1)兩碼事:指針變量和它指向的內(nèi)存塊變量2)條件反射:指針指向某個(gè)變量,就是把某個(gè)變量地址否給指針3)*p 間接賦值成立條件: 3 個(gè)條件a)2 個(gè)變量(通常一個(gè)實(shí)參,一個(gè)形參)b) 建立關(guān)系,實(shí)參取地址賦給形參指針c)*p 形參去間接修改實(shí)參的值Int iNum = 0; / 實(shí)參 int *p = NULL; p = &iNum; iNum = 1;*p =2 ; / 通過(guò) * 形參 = 間接地改變實(shí)參的值*p 成立的三個(gè)條件:4)引申: 函數(shù)調(diào)用時(shí) ,用 n 指針(形參)改變 n
21、-1 指針(實(shí)參)的值。 / 改變 0 級(jí)指針( int iNum = 1)的值有 2 種方式/ 改變 1 級(jí)指針( eg char *p = 0x1111 )的值,有 2 種方式/ 改變 2 級(jí)指針的( eg char *pp1 = 0x1111 )的值,有 2 種方式/ 函數(shù)調(diào)用時(shí),形參傳給實(shí)參,用實(shí)參取地址,傳給形參,在被調(diào)用函數(shù)里面用 *p ,來(lái)改變實(shí)參,把運(yùn)算結(jié)果傳出來(lái)。/ 指針作為函數(shù)參數(shù)的精髓。鐵律 3:理解指針必須和內(nèi)存四區(qū)概念相結(jié)合1)主調(diào)函數(shù) 被調(diào)函數(shù)a) 主調(diào)函數(shù)可把堆區(qū)、棧區(qū)、全局?jǐn)?shù)據(jù)內(nèi)存地址傳給被調(diào)用函數(shù)b) 被調(diào)用函數(shù)只能返回堆區(qū)、全局?jǐn)?shù)據(jù)2)內(nèi)存分配方式a) 指針
22、做函數(shù)參數(shù),是有輸入和輸出特性的。鐵律 4:應(yīng)用指針必須和函數(shù)調(diào)用相結(jié)合 (指針做函數(shù)參數(shù))編號(hào)指針函數(shù)參數(shù)內(nèi)存分配方式(級(jí)別 +堆棧)主調(diào)函數(shù) 實(shí)參被調(diào)函數(shù) 形參備注011 級(jí)指針 (做輸入)堆分配使用一般應(yīng)用禁用棧分配使用常用Int showbuf(char *p);int showArray(int *array, int iNum)021 級(jí)指針 (做輸出)棧使用結(jié)果傳出常用int geLen(char *pFileName, int *pfileLen);032 級(jí)指針 (做輸入)堆分配使用一般應(yīng)用禁 用棧分配使用常用int main(int arc ,char *arg); 指針數(shù)
23、組int shouMatrix(int 34, int iLine); 二維字符串?dāng)?shù)組042 級(jí)指針 (做輸出)堆使用分配常用,但不 建議用,轉(zhuǎn) 化成 02int getData(char *data, int *dataLen);Int getData_Free(void *data);Int getData Free(void *data); / 避免野指針053 級(jí)指針 (做輸出)堆使用分配不常用int getFileAllLine(char *content, int *pLine); int getFileAllLine Free(char *content, int *pLine)
24、;指針做函數(shù)參數(shù),問(wèn)題的實(shí)質(zhì)不是指針,而是看內(nèi)存塊,內(nèi)存塊是 1 維、2 維1)如果基礎(chǔ)類 int 變量,不需要用指針;2)若內(nèi)存塊是 1 維、2 維。鐵律 5:一級(jí)指針典型用法(指針做函數(shù)參數(shù))一級(jí)指針做輸入int showbuf(char *p)int showArray(int *array, int iNum)一級(jí)指針做輸出int geLen(char *pFileName, int *pfileLen); 理解主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存被調(diào)用函數(shù)是在 heap/stack 上分配內(nèi)存鐵律 6:二級(jí)指針典型用法(指針做函數(shù)參數(shù))二級(jí)指針做輸入int main(int arc ,ch
25、ar *arg); 字符串?dāng)?shù)組int shouMatrix(int 34, int iLine); 二級(jí)指針做輸出int Demo64_GetTeacher(Teacher *ppTeacher);int Demo65_GetTeacher_Free(Teacher *ppTeacher);int getData(char *data, int *dataLen);Int getData_Free(void *data);Int getData_Free2(void *data); / 避免野指針 理解主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存被調(diào)用函數(shù)是在 heap/stack 上分配內(nèi)存鐵律 7: 三
26、級(jí)指針輸出典型用法三級(jí)指針做輸出int getFileAllLine(char *content, int *pLine);int getFileAllLine_Free(char *content, int *pLine);理解 主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存 被調(diào)用函數(shù)是在 heap/stack 上分配內(nèi)存鐵律 8:雜項(xiàng),指針用法幾點(diǎn)擴(kuò)充1)野指針 2 種 free 形式int getData(char *data, int *dataLen);int getData_Free(void *data);int getData_Free2(void *data);2)2 次調(diào)用 主調(diào)函數(shù)第一
27、次調(diào)用被調(diào)用函數(shù)求長(zhǎng)度;根據(jù)長(zhǎng)度,分配內(nèi)存,調(diào)用被調(diào)用 函數(shù)。3)返回值 char */int/char *4)C程序書(shū)寫結(jié)構(gòu)商業(yè)軟件,每一個(gè)出錯(cuò)的地方都要有日志,日志級(jí)別鐵律 9:一般應(yīng)用禁用 malloc/new2.3 接口封裝設(shè)計(jì)思想引導(dǎo)基于 socketclient 客戶端接口設(shè)計(jì)與實(shí)現(xiàn)(仿真模擬)2.4 附錄【王保明老師經(jīng)典語(yǔ)錄】1)指針也是一種數(shù)據(jù)類型,指針的數(shù)據(jù)類型是指它所指向內(nèi)存空間的數(shù)據(jù)類型2 )間接賦值 *p 是指針存在的最大意義 ?3 )理解指針必須和內(nèi)存四區(qū)概念相結(jié)合 ?4)應(yīng)用指針必須和函數(shù)調(diào)用相結(jié)合(指針做函數(shù)參數(shù))指針是子彈, 函數(shù)是槍管; 子彈只有沿著槍管發(fā)射才
28、能顯示它的威力; 指針的學(xué)習(xí)重點(diǎn)不言 而喻了吧。接口的封裝和設(shè)計(jì)、模塊的劃分、解決實(shí)際應(yīng)用問(wèn)題;它是你的工具。5 )指針指向誰(shuí)就把誰(shuí)的地址賦給指針 ?6)指針指向誰(shuí)就把誰(shuí)的地址賦給指針,用它對(duì)付鏈表輕松加愉快7)鏈表入門的關(guān)鍵是分清楚鏈表操作和輔助指針變量之間的邏輯關(guān)系8)C/C+ 語(yǔ)言有它自己的學(xué)習(xí)特點(diǎn);若 java 語(yǔ)言的學(xué)習(xí)特點(diǎn)是學(xué)習(xí)、應(yīng)用、上項(xiàng)目;那么 C/C+ 語(yǔ)言的學(xué)習(xí)特點(diǎn)是:學(xué)習(xí)、理解、應(yīng)用、上項(xiàng)目。多了一個(gè)步驟吧。9 )學(xué)好指針才學(xué)會(huì)了 C 語(yǔ)言的半壁江山, 另外半壁江山在哪里呢?你猜, 精彩剖析在課堂。10) 理解指針關(guān)鍵在內(nèi)存,沒(méi)有內(nèi)存哪來(lái)的內(nèi)存首地址,沒(méi)有內(nèi)存首地址,哪來(lái)
29、的指針啊。3 字符串和一級(jí)指針內(nèi)存模型專題3.1 字符串基本操作字符數(shù)組初始化方法int main11()/1 大 號(hào)法 初始化列表/數(shù)組初始化有 2 種方法 默認(rèn)元素個(gè)數(shù)、指定元素個(gè)數(shù) char buf1 = a, b, c, d, e; / 若沒(méi)有指定長(zhǎng)度,默認(rèn)不分配零 /若指定長(zhǎng)度,不夠報(bào)錯(cuò); buf 長(zhǎng)度多于初始化個(gè)數(shù),會(huì)自動(dòng)補(bǔ)充零 char buf26 = a, b, c, d, e;char buf36 = a, b, c, d, e;/char buf45 = a, b, c, d, e;printf(buf3:%s, buf3); system(pause);在 C 語(yǔ)言中使用
30、字符數(shù)組來(lái)模擬字符串 C語(yǔ)言中的字符串是以 0 結(jié)束的字符數(shù)組 C語(yǔ)言中的字符串可以分配于??臻g,堆空間或者只讀存儲(chǔ)區(qū) / 在 C 語(yǔ)言中使用字符數(shù)組來(lái)模擬字符串/C 語(yǔ)言中的字符串是以 0 結(jié)束的字符數(shù)組/C 語(yǔ)言中的字符串可以分配于??臻g,堆空間或者只讀存儲(chǔ)區(qū)int main12()/1 用字符串來(lái)初始化數(shù)組char buf2 = a, b,c,d,0;/2 字符串常量初始化一個(gè)字符數(shù)組char buf3 = abcde; / 結(jié)論:會(huì)補(bǔ)充零char buf4 = abcde;char buf5100 = abcde;printf( strlen(buf5) :%d n, strlen(b
31、uf5);printf( sizeof(buf4) :%d n, sizeof(buf5);printf( sizeof(buf4) :%d n, sizeof(buf4); /strlen() 求字符串的長(zhǎng)度,注意字符串的長(zhǎng)度不包含 0 /sizeof( 類型 )字符串類型,的大小,包括 0; 02Sizeof 與 strlen 的區(qū)別數(shù)組法和指針?lè)ú僮髯址?3 字符串操作 數(shù)組法,下標(biāo)法 字符數(shù)組名,是個(gè)指針,是個(gè)常量指針; 字符數(shù)組名,代表字符數(shù)組首元素的地址,不代表整個(gè)數(shù)組的。 如果代表這個(gè)數(shù)組,那需要數(shù)組數(shù)據(jù)類型的知識(shí) ! 下期分解/ 字符串操作方法 數(shù)組下標(biāo)法 指針?lè)?int m
32、ain13()int i = 0;char buf5100 = abcde;char *p = NULL;/ 下標(biāo)法for (i=0; i100; i+) printf(%c, buf5i); printf(n);/ 指針?lè)?1 for (i=0; i100; i+) printf(%c, *(buf5+i);/buf5 是個(gè)指針,是個(gè)常量指針/ 指針?lè)?2 printf(n);p = buf5;for (i=0; i100; i+)printf(%c, *(p+i);/buf5 是個(gè)指針,是個(gè)常量指針 推演過(guò)程為: i 變 0+I, 去 號(hào)加 * 號(hào) / 其實(shí)本質(zhì):指針 *p 間接尋址,操作
33、內(nèi)存; / 編譯器為我們做了 *p 操作而已3.2 字符串做函數(shù)參數(shù)深入理解指針。 。的關(guān)鍵是什么? 指針和數(shù)組的巨大區(qū)別 char void copy_str01(char *from, char *to)for (; *from!=0; from+, to+)*to = *from;*to = 0;void copy_str02(char *from, char *to) while(*from!=0) *to+ = *from+; to = 0;void copy_str03(char *from, char *to)while( (*to=*from) !=0) to+; from+;
34、void copy_str04(char *from, char *to)while( (*to+=*from+) !=0)int copy_str05_good(const char *from, char *to) if (from=NULL | to=NULL)建立正確的程序運(yùn)行示意圖, (內(nèi)存四區(qū)及函數(shù)調(diào)用堆棧圖)是根本保障! !p = “abcdefg ”; Char *buf = “abcdefg ”; 一維字符串內(nèi)存模型:兩種printf(func copy_str05_good() err. (from=NULL | to=NULL)n); return -1;while( (
35、*to+=*from+) !=0)return 0; 典型錯(cuò)誤知多少 char *str_cnct(char *x, char* y)/* 簡(jiǎn)化算法 */char str380;char *z=str3; /* 指針 z 指向數(shù)組 str3*/ while(*z+=*x+);z-;/* 去掉串尾結(jié)束標(biāo)志 */while(*z+=*y+);z=str3;/* 將 str3 地址賦給指針變量 z*/return(z); 修改字符常量結(jié)果會(huì)如何 Char *p = “abcdefg ”;Modify p1 = 1;04 字符串操作易錯(cuò)/ 你往哪里輸入數(shù)據(jù)int main()char buf2000;
36、char *p = NULL; p = buf;printf(n 請(qǐng)輸入一個(gè)字符串 :);scanf(%s, p);printf(%s, p); getchar(); getchar();return 0;3.3 庫(kù)函數(shù) api快速的上手 api 是一種能力!int main31()char buf1100;char buf2200; strcpy(buf1, 111);printf(%s, strcat(buf1, 222); getchar();return 0;int main32()char *string2 = 747DC8;int length;/ 在字符 str1 中查找,與 s
37、tr2 中任意字符有公共交集的位置 length = strcspn(string1, string2);printf(Character where strings intersect is at position %dn, length); getchar();return 0;/strnset 函數(shù)有錯(cuò)誤/ 測(cè)試程序修改如下int main33()char string = abcdefghijklmnopqrstuvwxyz;char letter = x;printf(string before strnset: %sn, string); strnset(string, lette
38、r, 13);printf(string after strnset: %sn, string); getchar();return 0;int main44()char *string1 = abcdefghijklmnopqrstuvwxyz;char *string2 = onm;char *ptr;ptr = strpbrk(string1, string2);if (ptr) printf(strpbrk found first character: %cn, *ptr);else printf(strpbrk didnt find character in setn);getcha
39、r();return 0;int main55()char input16 = abc,d;char *p;/* strtok places a NULL terminator in front of the token, if found */ p = strtok(input, ,);if (p) printf(%sn, p);/* A second call to strtok using a NULL as the first parameter returns a pointer to the character following the token*/p = strtok(NUL
40、L, ,);if (p) printf(%sn, p);getchar();return 0;/ 典型的狀態(tài)函數(shù) int main()char str = now # is the time for all # good men to come to the # aid of their country; /char delims = #;char *delims = #; char *result = NULL;result = strtok( str, delims );while( result != NULL ) printf( result is %sn, result ); res
41、ult = strtok( NULL, delims );printf(=n);printf(%s, str); getchar();return 0;3.4 字符串相關(guān)一級(jí)指針內(nèi)存模型void main()char buf20= aaaa ;char buf2 = bbbb ;char *p1 = 111111 ;char *p2 = malloc(100); strcpy(p2,3333 );system( pause );return ;3.5 項(xiàng)目開(kāi)發(fā)字符串模型 strstr-whiledowhile 模型 兩頭堵模型 字符串反轉(zhuǎn)模型3.6 一級(jí)指針 (char *) 易錯(cuò)模型分析01
42、char * (字符串)做函數(shù)參數(shù)出錯(cuò)模型分析建立一個(gè)思想:是主調(diào)函數(shù)分配內(nèi)存,還是被調(diào)用函數(shù)分配內(nèi)存;/ 不要相信,主調(diào)函數(shù)給你傳的內(nèi)存空間,你可以寫。 。一級(jí)指針你懂了。 但是二級(jí)指針,你就不一定懂。 。拋出 。void copy_str21(char *from, char *to)if (*NULL = 0 | *to!= 0 )for (; *from!=0; from+, to+) *to = *from;*to = 0;/ 字符串逆序 int main() /char p1024 =0; char *p =0; p = NULL;char to100;copy str21(p,
43、to);C語(yǔ)言中沒(méi)有你不知道的,只有你不會(huì)調(diào)Java語(yǔ)言中沒(méi)有你不會(huì)調(diào)的,只有你不知道不斷修改內(nèi)存指針變量02 越界越界 語(yǔ)法級(jí)別的越界char buf3 = abc ;03 不斷修改指針變量的值越界void copy_str_err( char *from, char *to) for (; *from!= 0 ; from+, to+)*to = *from;*to = 0 ;printf( to:%s , to);printf( from:%s , from);04 你向外面?zhèn)鬟f什么1、臨時(shí) str3 內(nèi)存空間/ char *str_cnct(x,y) /* 簡(jiǎn)化算法 */ char *
44、x,*y;char *str_cnct(char *x, char* y) /* 簡(jiǎn)化算法 */ char str380;char *z=str3; /* 指針 z 指向數(shù)組 str3*/ while(*z+=*x+);z-;/* 去掉串尾結(jié)束標(biāo)志 */while(*z+=*y+);z=str3; /* 將 str3 地址賦給指針變量 z*/ return(z);2、經(jīng)驗(yàn)要學(xué)習(xí) while(*z+=*x+);z-;/* 去掉串尾結(jié)束標(biāo)志 */char *str_cnct(char *x, char* y) /* 簡(jiǎn)化算法 */ char * str3= (char *)malloc(80)ch
45、ar *z=str3; /* 指針 z 指向數(shù)組 str3*/ while(*z+=*x+);z-;/* 去掉串尾結(jié)束標(biāo)志 */while(*z+=*y+);z=str3; /* 將 str3 地址賦給指針變量 z*/return(z); char *str_cnct(char *x, char* y) /* 簡(jiǎn)化算法 */ If (x = NULL) Return NULL;char * str3= (char *)malloc(80)char *z=str3; /* 指針 z 指向數(shù)組 str3*/ while(*z+=*x+);z-;/* 去掉串尾結(jié)束標(biāo)志 */while(*z+=*y+
46、);z=str3; /* 將 str3 地址賦給指針變量 z*/ note: return(z); Main () Char *p = str_cnct(“ abcd” , “ ddeee” );If (p != NULL) Free(p) ;p = NULL/yezhizhen int getKeyByValude(char *keyvaluebuf, char *keybuf, char *valuebuf, int * valuebuflen)int result = 0;char *getbuf = new char100; memset(getbuf, 0, sizeof(getbu
47、f);char *trimbuf = new char100; memset(trimbuf, 0, sizeof(trimbuf); int destlen = strlen(keyvaluebuf);if (keybuf = NULL| | keyvaluebuf = NULL| | valuebuf = NULL/* | valuebuflen = NULL*/)result = -1;return result;if (strstr(keyvaluebuf, keybuf) = NULL)result = -1; return result;elsefor (int i = 0; i
48、destlen; i+)if (*keyvaluebuf = =)*keyvaluebuf+; break; keyvaluebuf+; while(*keyvaluebuf != 0)*valuebuf = *keyvaluebuf; valuebuf+; keyvaluebuf+;*valuebuf = 0;int len = strlen(valuebuf); return result;/char *p = abcd11111abcd2222abcdqqqqq; / 字符串中 abcd 出現(xiàn)的次數(shù)。 / 要求你 自己寫一個(gè)函數(shù)接口,并且寫出測(cè)試用例。/ 完成功能為:求出“ abcd”字
49、串出現(xiàn)的次數(shù)/ 輸入:int getSubCount(char *str, char *substr, int *mycount)int ret = 0;char *p = str;char *sub = substr;int count = 0;if (str=NULL | substr=NULL | mycount = NULL) ret = -1;return ret;/char *p = abcd11111abcd2222abcdqqqqqabcd;/char *p2 = NULL;/p2 = p;dop = strstr(p, sub);if (p!= NULL)count+;/+
50、后綴操作符優(yōu)先級(jí)高,所以先執(zhí)行 *p 操作 然后地址 + *mycount+;p = p + strlen(sub);elsebreak; while (*p != 0);/printf(count:%d n, count);/mycount 是實(shí)參的地址 * (實(shí)參的地址) *mycount = count;return ret;05 看圖06 重復(fù)的錯(cuò)誤何時(shí)休#include stdio.h#include stdlib.h#include string.hvoid copy_str21_modify(char *from, char *to) int i = 0;if (*from !=
51、 0)printf(ddddd);for (; *from!=0; from+, to+)*to = *from;*to = 0;printf(to:%s, to); printf(from:%s, from);void copy_str_err(char *from, char *to)for (; *from!=0; from+, to+)*to = *from;*to = 0;printf(to:%s, to); printf(from:%s, from);/ 字符串逆序int mainaaaa()char buf1100 = abcdefg;char to100; copy_str_err(buf1, to);/ 越界場(chǎng)景int main00000000000()char from5 = abcde; printf(n %s,from); getchar();return 0;3.7const 專題1、 const 基礎(chǔ)知識(shí)(用法、含義、好處、擴(kuò)展) int main() const int a; / int const b; const char *c;char * const d; char buf100const char * const e ; return 0;Int func1(const ) 初級(jí)理解: const 是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 少年歌曲音樂(lè)課件
- 插畫(huà)設(shè)計(jì)師課件
- 客運(yùn)市場(chǎng)調(diào)研合同
- 護(hù)理安全不良事件管理
- 學(xué)前教育實(shí)踐報(bào)告
- 處方點(diǎn)評(píng)知識(shí)培訓(xùn)
- 各類標(biāo)準(zhǔn)化會(huì)議接送合同
- VP氣體采購(gòu)合同
- 小兒急性喉炎護(hù)理
- 幼兒園汽車課件
- 2025年湖北漳富投資集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 農(nóng)業(yè)合作社與農(nóng)戶種植合作協(xié)議
- 2024年建筑業(yè)10項(xiàng)新技術(shù)
- (新版)鐵路機(jī)車車輛制動(dòng)鉗工(高級(jí))理論知識(shí)考試題庫(kù)及答案
- GB/T 25052-2010連續(xù)熱浸鍍層鋼板和鋼帶尺寸、外形、重量及允許偏差
- 13惡劣天氣監(jiān)理實(shí)施細(xì)則
- 景觀綠化和室外管網(wǎng)施工組織方案
- 心靈游戲之一“生命中最重要的五樣”
- 2013礦井反風(fēng)演習(xí)總結(jié)報(bào)告
- 新建物業(yè)承接查驗(yàn)備案表
- 炒股一招先100全集精華筆記-陳浩
評(píng)論
0/150
提交評(píng)論