傳智播客_C提高講義_第1頁
傳智播客_C提高講義_第2頁
傳智播客_C提高講義_第3頁
傳智播客_C提高講義_第4頁
傳智播客_C提高講義_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、輕松入門 實(shí)戰(zhàn)應(yīng)用 傳智播客C+學(xué)院 就業(yè)班第一階段C提高課程傳智播客C提高講義傳智掃地僧 1程序內(nèi)存模型1.1就業(yè)班引言1.1.1問題引出企業(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ū)、分層 信息系統(tǒng)的技術(shù)模型在分層 找出對(duì)我們初學(xué)者最近的那一層(哪些能力是你入行前,必須要掌握的)C項(xiàng)目開發(fā)的套路(一套接口) Ø /socket_client pool api

2、設(shè)計(jì)與實(shí)現(xiàn)Ø int sckClient_poolinit(void *handle);Ø 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_F

3、ree(void *hConnect, unsigned char *data);Ø int sckClient_putConnet(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)用

4、模型圖 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ì)致講解,從根本上提高初學(xué)者水平Ø 項(xiàng)目開發(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 Ø

5、; 提高課堂效率Ø 課堂例子,當(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)練和考試 1.1.4小結(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è)班第一階段的課程了。有沒

6、有一個(gè)標(biāo)準(zhǔn)?Ø 選擇法或者冒泡法排序Ø 在一個(gè)函數(shù)內(nèi)排序Ø 通過函數(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ù)據(jù)

7、類型的作用:編譯器預(yù)算對(duì)象(變量)分配的內(nèi)存空間大小Ø 程序舉例,如何求數(shù)據(jù)類型的大小sizeof(int *)Ø 請(qǐng)問:數(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);p

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

9、:%d n", sizeof(u8);printf("hello.n");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 * bu

10、ffer, int c, size_t num ); Ø 3、用法2: void修飾函數(shù)返回值和參數(shù),僅表示無。 如果函數(shù)沒有返回值,那么應(yīng)該將其聲明為void型 如果函數(shù)沒有參數(shù),應(yīng)該聲明其參數(shù)為void int function(void) return 1;Ø 4、void指針的意義 C語言規(guī)定只有相同類型的指針才可以相互賦值 void*指針作為左值用于“接收”任意類型的指針 void*指針作為右值賦值給其它指針時(shí)需要強(qiáng)制類型轉(zhuǎn)換 int *p1 = NULL; char *p2 = (char *)malloc(sizoeof(char)*20); Ø 5

11、、不存在void類型的變量 C語言沒有定義void究竟是多大內(nèi)存的別名Ø 6、擴(kuò)展閱讀void類型詳解.doc數(shù)據(jù)類型總結(jié)與擴(kuò)展Ø 1、數(shù)據(jù)類型本質(zhì)是固定內(nèi)存大小的別名;是個(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ù)組類型和

12、數(shù)組指針的關(guān)系思考2:C語言中,函數(shù)是可以看做一種數(shù)據(jù)類型嗎?a)若是,請(qǐng)說明原因并進(jìn)一步思考:函數(shù)這種數(shù)據(jù)類型,能再重定義嗎?b)若不是,也請(qǐng)說明原因。拋磚:1.3.2變量本質(zhì)分析變量概念Ø 概念:既能讀又能寫的內(nèi)存對(duì)象,稱為變量;若一旦初始化后不能修改的對(duì)象則稱為常量。Ø 變量定義形式: 類型 標(biāo)識(shí)符, 標(biāo)識(shí)符, , 標(biāo)識(shí)符 ; Ø 例如:int x ;int wordCut , Radius , Height ; double FlightTime , Mileage , Speed ; 變量本質(zhì) 1、程序通過變量來申請(qǐng)和命名內(nèi)存空間 int a = 02、

13、通過變量名訪問內(nèi)存空間(一段連續(xù))內(nèi)存空間的別名(是一個(gè)門牌號(hào)) 3、 修改變量有幾種方法?1、直接2、間接。內(nèi)存有地址編號(hào),拿到地址編號(hào)也可以修改內(nèi)存;于是橫空出世了!(編程案例)3、內(nèi)存空間可以再取給別名嗎?4、數(shù)據(jù)類型和變量的關(guān)系Ø 通過數(shù)據(jù)類型定義變量5、總結(jié)及思考題1 對(duì)內(nèi)存,可讀可寫;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 mai

14、n333()/2種方法,通過變量直接操作內(nèi)存/通過內(nèi)存編號(hào)操作內(nèi)存int i = 0;printf("&i:%dn", &i);*(int *)(1245024) = 10;printf("i:%d", i);printf("hello.n");getchar();return 0;1.3.3程序的內(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ū)元素分析1.4函數(shù)調(diào)用模型1.4.1基本原理1.4.2內(nèi)存四區(qū)模型和函數(shù)調(diào)用

15、模型變量傳遞分析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)存空間能用嗎?)1.4.3提示學(xué)好C語言的關(guān)鍵 1.4.4如何建立正確的程序運(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)用函

16、數(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生長方向Ø 測(cè)試stack生長方向Ø Heap、stack生長方向和內(nèi)存存放方向是兩個(gè)不同概念Ø 野指針Ø Malloc得到指針釋放問題測(cè)試Ø free(p)Ø fr

17、ee(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(p);system("pause");全局區(qū)代碼測(cè)試char * getstring1

18、()char *p1 = "abcde"return p1;char * getstring2()char *p2 = "abcde"return p2;void main()int i= 0;/指針指向誰就把誰的地址賦給指針變量。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 main01()c

19、har 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.1前言先

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

21、值*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:指針步長(p+),根據(jù)所致內(nèi)存空間的數(shù)據(jù)類型來確定p+=è(unsigned char )p+sizeof(a);結(jié)論:指針的步長,根據(jù)所指內(nèi)存空間類型來定。注意:建立指針指向誰,就把把誰的地址賦值給指針。圖和代碼和二為一。不斷的給指針變量賦值,就是不斷的改變指針變量(和所指向內(nèi)存空間沒有任何關(guān)系)。鐵

22、律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 ; /通過*形參 = 間接地改變實(shí)參的值*p成立的三個(gè)條件:4)引申: 函數(shù)調(diào)用時(shí),用n指針(形參)改變n-1指針(實(shí)參)的值。/改變0級(jí)指針(int iNum = 1)的值有2種方式/改變

23、1級(jí)指針(eg char *p = 0x1111 )的值,有2種方式/改變2級(jí)指針的(eg char *pp1 = 0x1111 )的值,有2種方式/函數(shù)調(diào)用時(shí),形參傳給實(shí)參,用實(shí)參取地址,傳給形參,在被調(diào)用函數(shù)里面用*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í)別+

24、堆棧)主調(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ù)組int shouMatrix(int 34, int iLine);二維字符串?dāng)?shù)組042級(jí)指針(做輸出)堆使用分配常用,但不建議用,轉(zhuǎn)化成02i

25、nt 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);指針做函數(shù)參數(shù),問題的實(shí)質(zhì)不是指針,而是看內(nèi)存塊,內(nèi)存塊是1維、2維。1) 如果基礎(chǔ)類int變量,不需要用指針;2) 若內(nèi)存塊是1維、2維。鐵律5:一級(jí)指針典型

26、用法(指針做函數(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 ,char *arg); 字符串?dāng)?shù)組int shouMatrix(int 34, int iLine);二級(jí)指針做輸出int Demo64_GetTeacher(Teacher *ppTe

27、acher);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: 三級(jí)指針輸出典型用法三級(jí)指針做輸出int getFileAllLine(char *content, int *pLine); int getFileAllLine_Free(char *cont

28、ent, 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ù)第一次調(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

29、.3接口封裝設(shè)計(jì)思想引導(dǎo) 基于socketclient客戶端接口設(shè)計(jì)與實(shí)現(xiàn)(仿真模擬)2.4附錄【王保明老師經(jīng)典語錄】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ā)射才能顯示它的威力;指針的學(xué)習(xí)重點(diǎn)不言而喻了吧。接口的封裝和設(shè)計(jì)、模塊的劃分、解決實(shí)際應(yīng)用問題;它是你的工具。5)指針指向誰就把誰的地址賦給指針 6)指針指向誰就把誰的地址賦給指針,用它對(duì)付鏈表輕松加愉快7)鏈表入

30、門的關(guān)鍵是分清楚鏈表操作和輔助指針變量之間的邏輯關(guān)系8)C/C+語言有它自己的學(xué)習(xí)特點(diǎn);若java語言的學(xué)習(xí)特點(diǎn)是學(xué)習(xí)、應(yīng)用、上項(xiàng)目;那么C/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 main11()/1 大號(hào)法 初始化列表/數(shù)組初始化有2種方法 默認(rèn)元素個(gè)數(shù)、指定元素個(gè)數(shù)char buf1 = 'a', 'b

31、', 'c', 'd', 'e'/若沒有指定長度,默認(rèn)不分配零/若指定長度,不夠報(bào)錯(cuò);buf長度多于初始化個(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', '

32、d', 'e'printf("buf3:%s", buf3);system("pause");在C語言中使用字符數(shù)組來模擬字符串C語言中的字符串是以0結(jié)束的字符數(shù)組C語言中的字符串可以分配于??臻g,堆空間或者只讀存儲(chǔ)區(qū)/在C語言中使用字符數(shù)組來模擬字符串/C語言中的字符串是以0結(jié)束的字符數(shù)組/C語言中的字符串可以分配于??臻g,堆空間或者只讀存儲(chǔ)區(qū)int main12()/1 用字符串來初始化數(shù)組char buf2 = 'a', 'b','c','d','0&#

33、39;/2 字符串常量初始化一個(gè)字符數(shù)組char buf3 = "abcde"/結(jié)論:會(huì)補(bǔ)充零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()求字符串的長度,注意字符串

34、的長度不包含0/sizeof(類型)字符串類型,的大小,包括0;02Sizeof與strlen的區(qū)別 數(shù)組法和指針法操作字符串03 字符串操作數(shù)組法,下標(biāo)法字符數(shù)組名,是個(gè)指針,是個(gè)常量指針;字符數(shù)組名,代表字符數(shù)組首元素的地址,不代表整個(gè)數(shù)組的。如果代表這個(gè)數(shù)組,那需要數(shù)組數(shù)據(jù)類型的知識(shí)!下期分解/字符串操作方法 數(shù)組下標(biāo)法 指針法int main13()int i = 0;char buf5100 = "abcde"char *p = NULL;/下標(biāo)法for (i=0; i<100; i+)printf("%c", buf5i);printf

35、("n");/指針法1for (i=0; i<100; i+)printf("%c", *(buf5+i);/buf5是個(gè)指針,是個(gè)常量指針/指針法2printf("n");p = buf5;for (i=0; i<100; i+)printf("%c", *(p+i);/buf5是個(gè)指針,是個(gè)常量指針推演過程為:i變0+I, 去號(hào)加*號(hào)/其實(shí)本質(zhì):指針*p間接尋址,操作內(nèi)存;/ 編譯器為我們做了*p操作而已3.2字符串做函數(shù)參數(shù)深入理解指針。的關(guān)鍵是什么?注意指針和數(shù)組的巨大區(qū)別char *p = “

36、abcdefg”;Char *buf = “abcdefg”;一維字符串內(nèi)存模型:兩種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) !=

37、9;0')to+; from+;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)printf("func copy_str05_good() err. (from=NULL | to=NULL)n");return -1;while( (*to+=*from+) !='0');return 0;典型錯(cuò)誤知多少cha

38、r *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;char *p = NULL;p = buf;printf("n請(qǐng)輸入一個(gè)字符串:"

39、);scanf("%s", p);printf("%s", p);getchar();getchar();return 0;3.3庫函數(shù)api快速的上手api是一種能力!建立正確的程序運(yùn)行示意圖,(內(nèi)存四區(qū)及函數(shù)調(diào)用堆棧圖)是根本保障!int main31()char buf1100;char buf2200;strcpy(buf1, "111");printf("%s", strcat(buf1, "222");getchar();return 0;int main32()char *stri

40、ng1 = "1234567890"char *string2 = "747DC8"int length;/在字符str1中查找,與str2中任意字符有公共交集的位置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 = "abcdefgh

41、ijklmnopqrstuvwxyz"char letter = 'x'printf("string before strnset: %sn", string);strnset(string, letter, 13);printf("string after strnset: %sn", string);getchar();return 0;int main44()char *string1 = "abcdefghijklmnopqrstuvwxyz"char *string2 = "onm&quo

42、t;char *ptr;ptr = strpbrk(string1, string2);if (ptr)printf("strpbrk found first character: %cn", *ptr);elseprintf("strpbrk didn't find character in setn");getchar();return 0;int main55() char input16 = "abc,d" char *p; /* strtok places a NULL terminator in front of

43、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(NULL, ","); if (p) printf("%sn", p);getchar();return 0;/

44、典型的狀態(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 "%s"n", result )

45、;result = 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");retu

46、rn ;3.5項(xiàng)目開發(fā)字符串模型strstr-whiledowhile模型兩頭堵模型 字符串反轉(zhuǎn)模型3.6一級(jí)指針(char *)易錯(cuò)模型分析01char *(字符串)做函數(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) Printf(“func copy_str21() errn”); return; for (; *from!=

47、'0' from+, to+)*to = *from;*to = '0'/字符串逆序int main()/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不斷修改指針變量的值越界void copy_str_err(char *from, char *to)for (; *from!='0

48、9; 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 *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+);

49、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)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) /*簡(jiǎn)化算法*/I

50、f (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+);z=str3; /*將str3地址賦給指針變量z*/ note:return(z);Main ()Char *p = str_cnct(“abcd”, “ddeee”);If (p != NULL) Free(p) ;p = NULL/yezhizhenint getKeyByValude(char *keyvaluebuf, char

51、 *keybuf, char *valuebuf, int * valuebuflen)int result = 0;char *getbuf = new char100;memset(getbuf, 0, sizeof(getbuf);char *trimbuf = new char100;memset(trimbuf, 0, sizeof(trimbuf);int destlen = strlen(keyvaluebuf);if (keybuf = NULL | keyvaluebuf = NULL | valuebuf = NULL/* | valuebuflen = NULL*/)re

52、sult = -1;return result;if (strstr(keyvaluebuf, keybuf) = NULL)result = -1;return result;elsefor (int i = 0; i < destlen; i+)if (*keyvaluebuf = '=')*keyvaluebuf+;break;keyvaluebuf+;while(*keyvaluebuf != '0')*valuebuf = *keyvaluebuf;valuebuf+;keyvaluebuf+;*valuebuf = '0'int

53、 len = strlen(valuebuf);return result;/char *p = "abcd11111abcd2222abcdqqqqq" /字符串中"abcd"出現(xiàn)的次數(shù)。/要求你 自己寫一個(gè)函數(shù)接口,并且寫出測(cè)試用例。/完成功能為:求出“abcd”字串出現(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

54、=NULL | mycount = NULL)ret = -1;return ret;/char *p = "abcd11111abcd2222abcdqqqqqabcd"/char *p2 = NULL;/p2 = p;do p = strstr(p, sub);if (p!= NULL)count+;/+后綴操作符優(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

溫馨提示

  • 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)論