傳智播客-C提高講義(掃地僧)_第1頁
傳智播客-C提高講義(掃地僧)_第2頁
傳智播客-C提高講義(掃地僧)_第3頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、傳智播客C提高講義傳智掃地僧1程序內(nèi)存模型1.1就業(yè)班引言問題引出企業(yè)需要能干活的人? C學(xué)到什么程度可以找工作?? 對(duì)于C/C+初級(jí)開發(fā)者,怎么達(dá)到企業(yè)的用人標(biāo)準(zhǔn)?就業(yè)問題問:老師,有沒有一個(gè)框框?有沒有一個(gè)標(biāo)準(zhǔn)???我們學(xué)什么哪?C工程開發(fā)需要什么(培養(yǎng)什么能力)成熟的、商業(yè)化的信息系統(tǒng)在分區(qū)、分層本地RAI"認(rèn)OCSFlh茅晉CAf*r旳逹淪CA'rh】|軸:劃川L06服務(wù)區(qū)符珅區(qū)信息系統(tǒng)的技術(shù)模型在分層鏈表陸列楞樹和二戈樹面試題訓(xùn)壕基本換作和如亡11、 講稲問誦信IP匚機(jī)制 數(shù)據(jù)編程C基礎(chǔ)丈習(xí)禪吃惡統(tǒng)編程I&皿下壩 V案例下項(xiàng)、案例ndroid 1O 巨開扶耒日

2、忐庫接口的封轉(zhuǎn)和設(shè)計(jì)模塊劃訊 斷層思維 即啊佞坪碰刀車口咖礴找S 接口力匡手:工:詩三尺非一日之毎 罵m經(jīng)號(hào)f=言找出對(duì)我們初學(xué)者最近的那一層(哪些能力是你入行前,必須要掌握的)救樞類型二大另支 勞構(gòu)悴函數(shù)遞歸 基本編程能力訓(xùn)塚 VX /c項(xiàng)目開發(fā)的套路(一套接口)? socket_client pool api 設(shè)計(jì)與實(shí)現(xiàn)? int sckClie nt_pooli ni t(void *ha ndle);? int sckClie nt_getC onn et(void *ha ndle, void *hCo nn ect);? int sckClie nt_sen dData(void

3、*hC onn ect, un sig ned char *data, int dataLe n);? int sckClie nt_getData(void *hC onn ect, un sig ned char *data, int *dataLe n);? int sckClie nt_getData_Free(void *hC onn ect, un sig ned char *data);? int sckClie nt_putC onn et(void *ha ndle, void *hCo nn ect);? int sckClient_pooldestory(void *ha

4、ndle);總結(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)用模型圖總體課程安排課程大綱? 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ì)致講解,從根本上提高初學(xué)者水平 ?項(xiàng)目開發(fā)中的重要點(diǎn)做剖析? 指針鐵律1 2 3 4 5 6 7 8 9 10=企業(yè)用人標(biāo)準(zhǔn)學(xué)員要求?資料,時(shí)間空間管理?工作經(jīng)驗(yàn),記錄和積累?臨界點(diǎn)?事物認(rèn)知

5、規(guī)律?挑戰(zhàn) *p,*p, *p?提高課堂效率?課堂例子,當(dāng)堂運(yùn)行。?錄制視頻說明(不來,看視頻)? 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)練和考試小結(jié)?建立信心?接口的封裝和設(shè)計(jì)?指針教學(xué),多年實(shí)踐檢驗(yàn)?心態(tài)放輕松了?分析有效時(shí)間?尊重事物認(rèn)知規(guī)律、給自己一次機(jī)會(huì)1.2學(xué)員聽課的標(biāo)準(zhǔn)c語言學(xué)到什么程度,就可以聽懂傳智播客就業(yè)班第一階段的課程了 有沒有一個(gè)標(biāo)準(zhǔn)?? 選擇法或者冒泡法排序?在一個(gè)函數(shù)內(nèi)排序?通過函數(shù)調(diào)用的方式排序?數(shù)組做函數(shù)參數(shù)的技術(shù)盲點(diǎn)和推演1.3內(nèi)存四區(qū)專題講座數(shù)據(jù)類型本質(zhì)分析數(shù)

6、據(jù)類型概念? 類型”是對(duì)數(shù)據(jù)的抽象?類型相同的數(shù)據(jù)有相同的表示形式、存儲(chǔ)格式以及相關(guān)的操作?程序中使用的所有數(shù)據(jù)都必定屬于某一種數(shù)據(jù)類型數(shù)據(jù)類型浮點(diǎn)型(float,double)基本類型字符型(血町)簡單類型一'空類型V0W)'用戶定義類型 枚舉類型(enum)數(shù)組(| |)結(jié)構(gòu)(struct)結(jié)構(gòu)類型 聯(lián)合(union)1 類 ()1指針類型*)數(shù)據(jù)類型的本質(zhì)思考? 思考數(shù)據(jù)類型和內(nèi)存有關(guān)系嗎??C/C+為什么會(huì)引入數(shù)據(jù)類型?數(shù)據(jù)類型的本質(zhì)?數(shù)據(jù)類型可理解為創(chuàng)建變量的模具(模子);是固定內(nèi)存大小的別名?數(shù)據(jù)類型的作用:編譯器預(yù)算對(duì)象(變量)分配的內(nèi)存空間大小?程序舉例,如何求

7、數(shù)據(jù)類型的大小sizeof(i nt *)?請(qǐng)問:數(shù)據(jù)類型可以有別名嗎?數(shù)據(jù)類型可以自定義嗎?數(shù)據(jù)類型大小int mai n()int a = 10;int b10;printf("int a:%d n", sizeof(a);prin tf("i nt a:%d n", sizeof(i nt *);printf("int b:%d n", sizeof(b);printf("int b:%d n", sizeof(b0);printf("int b:%d n", sizeof(*b);pri

8、ntf("hellon");getchar();return 0;sizeof是操作符,不是函數(shù);sizeof測量的實(shí)體大小為編譯期間就已確定數(shù)據(jù)類型別名?數(shù)據(jù)類型可以理解為固定大小內(nèi)存塊的別名,請(qǐng)問數(shù)據(jù)類型可以起別名嗎?int mai n()/Teacher t1;prin tf("Teacher:%d n", sizeof(Teacher);printf("u32:%d n", sizeof(u32);printf("u8:%d n", sizeof(u8);printf("hello.n"

9、);getchar();return 0;數(shù)據(jù)類型的封裝? 1、void的字面意思是“無類型” ,void *則為“無類型指針” ,void *可以 指向任何類型的數(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, i nt c, size_t num );? 3、用法2: void修飾函數(shù)返回值和參數(shù),僅表示無。如果

10、函數(shù)沒有返回值,那么應(yīng)該將其聲明為void型如果函數(shù)沒有參數(shù),應(yīng)該聲明其參數(shù)為voidint function(v oid)return 1;? 4、void指針的意義C語言規(guī)定只有相同類型的指針才可以相互賦值void*指針作為左值用于“接收”任意類型的指針void*指針作為右值賦值給其它指針時(shí)需要強(qiáng)制類型轉(zhuǎn)換int *p1 = NULL;char *p2 = (char *)malloc(sizoeof(char)*20);? 5、不存在void類型的變量C語言沒有定義void究竟是多大內(nèi)存的別名? 6、擴(kuò)展閱讀void類型詳解.doc數(shù)據(jù)類型總結(jié)與擴(kuò)展? 1、數(shù)據(jù)類型本質(zhì)是固定內(nèi)存大小的別

11、名;是個(gè)模具,c語言規(guī)定:通過數(shù)據(jù)類型定義變量。? 2、數(shù)據(jù)類型大小計(jì)算(sizeof)? 3、可以給已存在的數(shù)據(jù)類型起別名typedef? 4、數(shù)據(jù)類型封裝概念(void萬能類型)思考1:C 一維數(shù)組、二維數(shù)組有數(shù)據(jù)類型嗎?int array10若有,數(shù)組類型又如何表達(dá)?又如定義?若沒有,也請(qǐng)說明原因。拋磚:數(shù)組類型,壓死初學(xué)者的三座大山1、數(shù)組類型2、數(shù)組指針3、數(shù)組類型和數(shù)組指針的關(guān)系思考2:C語言中,函數(shù)是可以看做一種數(shù)據(jù)類型嗎?a)若是,請(qǐng)說明原因并進(jìn)一步思考:函數(shù)這種數(shù)據(jù)類型,能再重定義嗎?b)若不是,也請(qǐng)說明原因。拋磚:變量本質(zhì)分析變量概念概念:既能讀又能寫的內(nèi)存對(duì)象,稱為變量;

12、若一旦初始化后不能修改的對(duì)象則稱為常量。變量定義形式:類型 標(biāo)識(shí)符,標(biāo)識(shí)符,標(biāo)識(shí)符;例如:int x ;int wordCut , Radius , Height例如doubleFlightTime , Mileage , Speed ;變量本質(zhì)1、程序通過變量來申請(qǐng)和命名內(nèi)存空間 int a = 02、通過變量名訪問內(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)系? 通過數(shù)據(jù)類型定義變量5、總結(jié)及思考題1對(duì)內(nèi)存,可讀可寫;

13、2通過變量往內(nèi)存讀寫數(shù)據(jù);3不是向變量讀寫數(shù)據(jù), 而是向變量所代表的內(nèi)存空間中寫數(shù)據(jù)。問:變量跑哪去了?思考1:變量三要素(名稱、大小、作用域),變量的生命周期?思考2: C+編譯器是如何管理函數(shù)1,函數(shù)2變量之間的關(guān)系的?=引出兩個(gè)重要話題:內(nèi)存四區(qū)模型函數(shù)調(diào)用模型重要實(shí)驗(yàn):int main333()/2種方法,通過變量直接操作內(nèi)存/ 通過內(nèi)存編號(hào)操作內(nèi)存int i = 0;printf("&i:%dn", &i);*(i nt *)(1245024) = 10;prin tf("i:%d", i);prin tf("hell

14、o.n");getchar();return 0;程序的內(nèi)存四區(qū)模型內(nèi)存四區(qū)的建立流程流程說明1、 操作系統(tǒng)把物理硬盤代碼load到內(nèi)存2、操作系統(tǒng)把c代碼分成四個(gè)區(qū)3、操作系統(tǒng)找到 main函數(shù)入口執(zhí)行各區(qū)元素分析1SE Cstack):由編譯器自和分?jǐn)孲b存砸嚴(yán):的壽數(shù)倚 局部變捷的值爭堆區(qū)(昨):一般由程序員分配釋膠(動(dòng)態(tài)內(nèi)存申諾與釋放),若程序員不釋斷 程 序結(jié)束時(shí)可能由操作系統(tǒng)回收.全烏反(齡態(tài)配)(st血)全烏變量和靜態(tài)變量的存儲(chǔ)是敢在一塊的,初始化的全烏 變量和靜態(tài)變量在一塊區(qū)城,齊初始化的全局變量和未初始化的靜態(tài)變量在相魏的另一 塊區(qū)域,該區(qū)域在程序結(jié)束后由操作蔡統(tǒng)

15、緡籤-常毘區(qū)I字符串常運(yùn)和蔓他常重的存儲(chǔ)位直,程序結(jié)束后由操作系統(tǒng)釋販程序代存飯函數(shù)體的二進(jìn)制代碼-1.4函數(shù)調(diào)用模型基本原理_坦()的參奴返回地址mainOfa()他0以()運(yùn)廳狀態(tài)他()的參數(shù)返回地址' main 三運(yùn)亍表態(tài)| mam()豹參救返回也址J操乍系統(tǒng)運(yùn)亡氓忑|堆棧iunln()fa()fb()內(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,通過參數(shù)傳遞的變量(內(nèi)存空間能用嗎?)11m的內(nèi)存:堆匚可被由,n爲(wèi)

16、歟好解用3珀也 全局區(qū)分旺爲(wèi)b.話比二內(nèi)存,足町吐褫 “和亦in丞數(shù)惶用的£ams國數(shù)口可卽在橫廿內(nèi)齊/可以在吃 上聽國內(nèi)存,全陌電吩紀(jì)FJ7T緒論;fbij弔他申請(qǐng)的內(nèi)菇可以誡”弘使用前1 fh卞在橈上分配的為存不旅枝Fc和時(shí)和函 數(shù)使用2 fhTita提示學(xué)好C語言的關(guān)鍵如何建立正確的程序運(yùn)行內(nèi)存布局圖?內(nèi)存四區(qū)模型&函數(shù)調(diào)用模型?函數(shù)內(nèi)元素?深入理解數(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)

17、:指針做函 數(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)練?測試heap生長方向? 測試stack生長方向? Heap、stack生長方向和內(nèi)存存放方向是兩個(gè)不同概念?野指針? Malloc得到指針釋放問題測試? free(p)? free(p+1),深入理解豐翹縣嚴(yán)空間的標(biāo)號(hào)就已1.6作業(yè)強(qiáng)化訓(xùn)練1劃出內(nèi)存四區(qū)void mai n26()char buf1OO;/byte b1 = new byte100;int a

18、 = 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(p);system("pause");全局區(qū)代碼測試char * getstri ng1()char *p1 = "abcde"return p1;char * getstri ng2()char *p2 = "abcde&q

19、uot;return p2;void mai n()int i= 0;/指針指向誰就把誰的地址賦給指針變量。char *p1 = getstri ng1();char *p2 = getstri ng2();char * p3 = NULL; p3 是個(gè)變量/指針變量和它所執(zhí)行的內(nèi)存空間變量是兩個(gè)不同的概念strcmp(p1, p2);system("pause");訓(xùn)練2劃出內(nèi)存四區(qū)void mai n01() char buf1OO;/byte b1 = new byte100;int a = 10; /分配4個(gè)字節(jié)的內(nèi)存 棧區(qū)也叫臨時(shí)區(qū)int *p;分配4個(gè)字節(jié)的內(nèi)存

20、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.1前言先從整體上把握指針的知識(shí)體系。然后突破1級(jí)指針、二級(jí)指針、多級(jí)指針。2.2指針強(qiáng)化鐵律1:指針是一種數(shù)據(jù)類型1)指針也是一種變量,占有內(nèi)存空間,用來保存內(nèi)存地址測試指針變

21、量占有內(nèi)存空間大小2)*p操作內(nèi)存在指針聲明時(shí),*號(hào)表示所聲明的變量為指針在指針使用時(shí),*號(hào)表示 操作 指針?biāo)赶虻膬?nèi)存空間中的值*P相當(dāng)于通過地址(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ì)改變所指的內(nèi)容;p = p +1; p+/含義2給*p賦值*p='a'不會(huì)改變指針變量的值,只會(huì)改變所指的內(nèi)存塊的值/含義3 =左邊*p表示 給內(nèi)存賦值,=右邊*p表示取值 含義不同切結(jié)!/含義4 =左邊char *p/

22、含義5保證所指的內(nèi)存塊能修改4)指針是一種數(shù)據(jù)類型,是指它指向的內(nèi)存空間的數(shù)據(jù)類型含義1:指針步長(p+),根據(jù)所致內(nèi)存空間的數(shù)據(jù)類型來確定p+= (un sig ned char )p+sizeof(a);結(jié)論:指針的步長,根據(jù)所指內(nèi)存空間類型來定。注意:建立指針指向誰,就把把誰的地址賦值給指針。圖和代碼和二為一。不斷的給指針變量賦值,就是不斷的改變指針變量(和所指向內(nèi)存空間沒有任何關(guān)系)。鐵律2:間接賦值(*p )是指針存在的最大意義1)兩碼事:指針變量和它指向的內(nèi)存塊變量2)條件反射:指針指向某個(gè)變量,就是把某個(gè)變量地址否給指針3) *p間接賦值成立條件:3個(gè)條件a)2個(gè)變量(通常一個(gè)實(shí)

23、參,一個(gè)形參)b)建立關(guān)系,實(shí)參取地址賦給形參指針c)*p形參去間接修改實(shí)參的值Int iNum = 0; / 實(shí)參int *p = NULL;p = &iNum;iNum = 1;*p =2 ; /通過*形參=間接地改變實(shí)參的值*p成立的三個(gè)條件:4)引申:函數(shù)調(diào)用時(shí),用n指針(形參)改變n-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ù)里

24、面用 *p,來改變實(shí)參,把運(yùn)算結(jié)果傳出來。/指針作為函數(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)指針做函數(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(i nt *array, int iNum)02

25、1級(jí)指針(做輸出)棧使用結(jié)果傳出常用int geLe n( char *pFileName, int *pfileLe n);032級(jí)指針(做輸入)堆分配使用一般應(yīng)用禁 用棧分配使用常用int main (i nt arc ,char *arg); 指針數(shù)組 int shouMatrix(int 34, int iLine); 二纟1隹字符串?dāng)?shù)組042級(jí)指針(做輸出)堆使用分配常用,但不 建議用,轉(zhuǎn)化成02int getData(char *data, int *dataLe n);Int getData_Free(void *data);Int getData Free(void *data

26、); / 避免野指針053級(jí)指針(做輸出)堆使用分配不常用int getFileAllLi ne(char *c onten t, i nt *pL in e);int getFileAllL in e Free(char *c onten t, int *pL in e);指針做函數(shù)參數(shù),冋題的實(shí)質(zhì)不是指針,而是看內(nèi)存塊,內(nèi)存塊是1)如果基礎(chǔ)類int變量,不需要用指針;2)若內(nèi)存塊是1維、2維。1維、2維。鐵律5: 級(jí)指針典型用法(指針做函數(shù)參數(shù))一級(jí)指針做輸入int showbuf(char *p)int showArray(i nt *array, int iNum)一級(jí)指針做輸出int

27、 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 ,char *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, i

28、nt *dataLe n);Int getData_Free(void *data);In t getData_Free2(void *data); / 避免野指針理解一主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存 被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存鐵律7:三級(jí)指針輸出典型用法三級(jí)指針做輸出int getFileAllLi ne(char *con ten t, i nt *pL in e); int getFileAllL in e_Free(char *c onten t, int *pL in e); 理解一主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存 被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存鐵律8雜

29、項(xiàng),指針用法幾點(diǎn)擴(kuò)充1)野指針2種free形式int getData(char *data, int *dataLe n);int getData_Free(void *data);in t getData_Free2(void *data);2)2次調(diào)用主調(diào)函數(shù)第一次調(diào)用被調(diào)用函數(shù)求長度;根據(jù)長度,分配內(nèi)存,調(diào)用被調(diào)用 函數(shù)。3)返回值 char */int/char *4)C程序書寫結(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)典語錄】1

30、)指針也是一種數(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ā)射才能顯示它的威力;指針的學(xué)習(xí)重點(diǎn)不言而喻了吧。接口的封裝和設(shè)計(jì)、模塊的劃分、解決實(shí)際應(yīng)用問題;它是你的工具。5) 指針指向誰就把誰的地址賦給指針6) 指針指向誰就把誰的地址賦給指針,用它對(duì)付鏈表輕松加愉快7) 鏈表入門的關(guān)鍵是分清楚鏈表操作和輔助指針變量之間的邏輯關(guān)系8) C/C+語言有它自己的學(xué)習(xí)特點(diǎn);若 java語言的學(xué)習(xí)特點(diǎn)是學(xué)習(xí)、應(yīng)用、上項(xiàng)目;那么C/

31、C+語言的學(xué)習(xí)特點(diǎn)是:學(xué)習(xí)、理解、應(yīng)用、上項(xiàng)目。多了一個(gè)步驟吧。9) 學(xué)好指針才學(xué)會(huì)了 C語言的半壁江山,另外半壁江山在哪里呢?你猜,精彩剖析在課堂。10) 理解指針關(guān)鍵在內(nèi)存,沒有內(nèi)存哪來的內(nèi)存首地址,沒有內(nèi)存首地址,哪來的指針啊。3字符串和一級(jí)指針內(nèi)存模型專題3.1字符串基本操作字符數(shù)組初始化方法int mai n11()1大號(hào)法初始化列表/數(shù)組初始化有2種方法默認(rèn)元素個(gè)數(shù)、指定元素個(gè)數(shù)char buf1 = 'a', 'b', 'c', 'd', 'e'/若沒有指定長度,默認(rèn)不分配零/若指定長度,不夠報(bào)錯(cuò);b

32、uf長度多于初始化個(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

33、");在C語言中使用字符數(shù)組來模擬字符串C語言中的字符串是以0 '結(jié)束的字符數(shù)組C語言中的字符串可以分配于棧空間,堆空間或者只讀存儲(chǔ)區(qū)II在C語言中使用字符數(shù)組來模擬字符串/C語言中的字符串是以0 '結(jié)束的字符數(shù)組/C語言中的字符串可以分配于棧空間,堆空間或者只讀存儲(chǔ)區(qū)int mai n12()H1用字符串來初始化數(shù)組char buf2 = 'a', 'b','c','d','O'/2字符串常量初始化一個(gè)字符數(shù)組char buf3 = "abcde" / 結(jié)論:會(huì)補(bǔ)充零

34、 char buf4 = "abcde"char buf5100 = "abcde"printf(” strlen(buf5) :%d n", strlen(buf5); printf(” sizeof(buf4):%d n", sizeof(buf5); printf(" sizeof(buf4) :%d n", sizeof(buf4);/strlen()求字符串的長度,注意字符串的長度不包含0/sizeof(類型)字符串類型,的大小,包括 0 ;02Sizeof與 strlen 的區(qū)別數(shù)組法和指針法操作字符串

35、03字符串操作 數(shù)組法,下標(biāo)法 字符數(shù)組名,是個(gè)指針,是個(gè)常量指針; 字符數(shù)組名,代表字符數(shù)組首元素的地址,不代表整個(gè)數(shù)組的。 如果代表這個(gè)數(shù)組,那需要數(shù)組數(shù)據(jù)類型的知識(shí)!下期分解/字符串操作方法數(shù)組下標(biāo)法指針法int mai n13()int i = 0;char buf5100 = "abcde"char *p = NULL;/下標(biāo)法for (i=0; i<100; i+)prin tf("%c", buf5i);prin tf("n");/指針法1for (i=0; i<100; i+)prin tf("%

36、c", 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+;char *str_cnct(char *x, char* y)/* 簡化算法 */char str380;char *z=str3; /* 指針 z 指向數(shù)組 str3*/while(*z+=*x+);z-;/*去掉串

37、尾結(jié)束標(biāo)志*/while(*z+=*y+);z=str3;/*將str3地址賦給指針變量 z*/return(z);int mai n31()char buf1100;char buf2200;strcpy(buf1, "111");prin tf("%s", strcat(buf1, "222");getchar();return 0;int mai n32()char *stri ng1 = "1234567890"char *stri ng2 = "747DC8"int len gth;/

38、在字符str1中查找,與str2中任意字符有公共交集的位置length = strcspn(string1, string2);prin tf("Character where stri ngs in tersect is at positi on %dn", le ngth);(buf5+i);buf5是個(gè)指針,是個(gè)常量指針I(yè)I指針法2prin tf("n");p = buf5;for (i=0; i<100; i+)prin tf("%c", *(p+i);IIbuf5是個(gè)指針,是個(gè)常量指針推演過程為:i變0+1,去號(hào)加*號(hào)

39、 II其實(shí)本質(zhì):指針*p間接尋址,操作內(nèi)存;編譯器為我們做了 *p操作而已3.2字符串做函數(shù)參數(shù)深入理解指針。oooooooooo的關(guān)鍵是什么?指針和數(shù)組的巨大區(qū)別char *p =“ abcdefg ”Char *buf =“ abcdefg一維字符串內(nèi)存模型:兩種*to = '0:void copy_str03(char *from, char *to)while( (*to=*from) !='0')to+;from+;void copy_str04(char *from, char *to)while( (*to+=*from+) !='0')5

40、int copy_str05_good(c onst char *from, char *to)if (from=NULL | to=NULL)prin tf("fu nc copy_str05_good() err. (from=NULL | to=NULL)n"); return -1;while( (*to+=*from+) !='0')5return 0;典型錯(cuò)誤知多少修改字符常量結(jié)果會(huì)如何Char *p =“ abcdefg ”;Modify p1 ='1';04字符串操作易錯(cuò)/你往哪里輸入數(shù)據(jù)int mai n()char buf

41、2000;char *p = NULL;p = buf;printf("n請(qǐng)輸入一個(gè)字符串:"); scan f("%s", p);prin tf("%s", p);getchar(); getchar();return 0;3.3庫函數(shù)api快速的上手api是一種能力!建立正確的程序運(yùn)行示意圖,(內(nèi)存四區(qū)及函數(shù)調(diào)用堆棧圖)是根本保障! getchar(); return 0;/strnset函數(shù)有錯(cuò)誤/測試程序修改如下int mai n33()char stri ng = "abcdefghijkl mn opqrstuv

42、wxyz"char letter = 'x'prin tf("stri ng before strn set: %sn", stri ng);strn set(stri ng, letter, 13);printf("string afterstrnset: %sn", string);getchar();return 0;int main44()char *stri ng1 = "abcdefghijkl mno pqrstuvwxyz"char *stri ng2 = "on m"ch

43、ar *ptr;ptr = strpbrk(string1, string2);if (ptr)prin tf("strpbrk found first character: %cn", *ptr); elseprin tf("strpbrk did n't find character in setn"); getchar();return 0;int main 55()char in put16 = "abc,d"char *p;/* strtok places a NULL termi natorin front of

44、the toke n, if found */p = strtok(i nput, ",");if (p) prin tf("%sn", p);/* A seco nd call to strtok usi ng a NULL as the first parameter retur ns a poin ter to the character follow ing the toke n*/p = strtok(NULL,",”);if (p) printf("%sn", p);getchar();return 0;/典型的

45、狀態(tài)函數(shù)int mai n()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 ) prin tf( "result is "%s"n", result )

46、; result = strtok( NULL, delims );prin tf("=二n ”);prin tf("%s", str);getchar();return 0;3.4字符串相關(guān)一級(jí)指針內(nèi)存模型void main()char buf20="aaaa"char buf2 ="bbbb"char *p1 ="111111"I!3333");char *p2 = malloc(100); strcpy(p2,system( "pause"); return ;字可些1

47、軸希針的內(nèi)存檸豐列1 Luf和少忖的込刖itr(a 國常 全fl匡級(jí)捋針(chai +)Ft存E塚圖建立正確的內(nèi)存圖是C丸門的坯經(jīng)之路靜態(tài)區(qū)嚨區(qū)Htllll222220堆區(qū)heap1WbFaint wiain ()Iclii±L LllC .20 m * abcdt? *char 和I =*11111*,char 4p2 -*alloc(100);EtrcpfpSj*22223看程序畫內(nèi)存尋畳曇內(nèi)存空問的刖名代碼區(qū)3.5項(xiàng)目開發(fā)字符串模型strstr -whiledowhile 模型兩頭堵模型字符串反轉(zhuǎn)模型char *p 一 ' abcdefg3.6 級(jí)指針(char *)易

48、錯(cuò)模型分析Olchar * (字符串)做函數(shù)參數(shù)出錯(cuò)模型分析for (; *from!='0: from+, to+)*to = *from;*to = '0'/字符串逆序int mai n()/char p1024 =0;char *p =0; p = NULL;char to100;copy_str21(p, to);C語言中沒有你不知道的,只有你不會(huì)調(diào) Java語言中沒有你不會(huì)調(diào)的,只有你不知道 不斷修改內(nèi)存指針變量02越界越界語法級(jí)別的越界char buf3 = "abc"03不斷修改指針變量的值越界04你向外面?zhèn)鬟f什么1、臨時(shí)str3內(nèi)存空

49、間/ char *str_cnct(x,y) /*簡化算法 */ char *x,*y;char *str_cnct(char *x, char* y) /*簡化算法 */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) /*簡化算法 */char * s

50、tr3= (char *)malloc(80)char *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) /*簡化算法 */If (x = NULL)Retur n NULL;char * str3= (char *)malloc(80)char *z=str3; /* 指針 z 指向數(shù)組 str3*/ while(*z+=*x+);z-;/*去掉串尾結(jié)束標(biāo)志*

51、/while(*z+=*y+);z=str3;/*將str3地址賦給指針變量 z*/ note:return(z);Mai n ()Char *p = str_cnct(“abed" ,“ddeee");If (p != NULL) Free(p) ;p = NULL/yezhizhenint getKeyByValude(char *keyvaluebuf, char *keybuf, char *valuebuf, i nt valuebufle n)int result = 0;char *getbuf = new char100;memset(getbuf, 0,

52、sizeof(getbuf);char *trimbuf = new char100;memset(trimbuf, 0, sizeof(trimbuf);int destle n = strle n( keyvaluebuf);if (keybuf = NULL| keyvaluebuf = NULL| valuebuf = NULL/* | valuebuflen =NULL*/)result = -1;return result;if (strstr(keyvaluebuf, keybuf) = NULL)result = -1;return result;elsefor (i nt i

53、 = 0; i < destle n; i+)if (*keyvaluebuf ='=')*keyvaluebuf+;break;keyvaluebuf+;while(*keyvaluebuf != '0')*valuebuf = *keyvaluebuf;valuebuf+; keyvaluebuf+;*valuebuf = '0'int len = strle n( valuebuf);return result;/char *p = "abcd11111abcd2222abcdqqqqq" / 字符串中"

54、abed"出現(xiàn)的次數(shù)。/要求你 自己寫一個(gè)函數(shù)接口,并且寫出測試用例。/完成功能為:求出"abed”字串出現(xiàn)的次數(shù)/輸入:int getSubCo un t(char *str, char *substr, i nt *myeo unt)int ret = 0;char *p = str;char *sub = substr;int count = 0;if (str=NULL | substr=NULL | mycou nt = NULL)ret = -1;return ret;/char *p = "abcd11111abcd2222abcdqqqqqabcd"/char *p2 = NULL;/p2 = p;dop = strstr(p, sub);if (p!= NULL)coun t+;/+后綴操作符優(yōu)先級(jí)高,所以先執(zhí)行*p操作 然后地址+*myco un t+;p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論