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

下載本文檔

版權(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è)班引言企業(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 *handle);int sckClient_getCon

2、net(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(void *handle, void *hConnect);in

3、t 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)用模型圖課程大綱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)目開(kāi)發(fā)中的重要點(diǎn)做剖析指針鐵律 1 2 3 4 5 6 7 8 9 10= 企業(yè)用人標(biāo)準(zhǔn)資料,時(shí)間空間管理 工作

4、經(jīng)驗(yàn),記錄和積累 臨界點(diǎn)事物認(rèn)知規(guī)律 挑戰(zhàn) *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)練和考試建立信心接口的封裝和設(shè)計(jì) 指針教學(xué),多年實(shí)踐檢驗(yàn)心態(tài)放輕松了分析有效時(shí)間 尊重事物認(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ū)專題講座數(shù)據(jù)類型概念類型”是對(duì)數(shù)據(jù)的抽

5、象 類型相同的數(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ù)類型的作用:編譯器預(yù)算對(duì)象(變量)分配的內(nèi)存空間大小程序舉例,如何求數(shù)據(jù)類型的大小sizeof(i nt *)請(qǐng)問(wèn):數(shù)據(jù)類型可以有別名嗎?數(shù)據(jù)類型可以自定義嗎?數(shù)據(jù)類型大小int mai n() int a = 10;int b10;prin tf("i nt a:%d n", sizeof(a);prin tf(&q

6、uot;i nt a:%d n", sizeof(i nt *);prin tf("i nt b:%d n", sizeof(b);prin tf("i nt b:%d n", sizeof(b0);prin tf("i nt b:%d n", sizeof(*b);printf("hello.n");getcharO;return 0;sizeof是操作符,不是函數(shù);sizeof測(cè)量的實(shí)體大小為編譯期間就已確定數(shù)據(jù)類型別名數(shù)據(jù)類型可以理解為固定大小內(nèi)存塊的別名,請(qǐng)問(wèn)數(shù)據(jù)類型可以起別名嗎?int mai

7、n()/Teacher t1;prin tf("Teacher:%d n", sizeof(Teacher);prin tf("u32:%d n", sizeof(u32);prin tf("u8:%d 'n", sizeof(u8);printf("hello.rr);getchar();return 0;數(shù)據(jù)類型的封裝1、void的字面意思是“無(wú)類型” ,void *則為“無(wú)類型指針” ,void *可以指向任何類型的數(shù)據(jù)。2、用法1:數(shù)據(jù)類型的封裝int In itHardE nv(void *ha ndle)

8、;典型的如內(nèi)存操作函數(shù) memcpy和memset的函數(shù)原型分別為void * memc py( void *dest, const void *src, size_t len);void * memset ( void * buffer, i nt 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) return 1;4、void 指針的意義C語(yǔ)言規(guī)定只有相同類型的指針才可以相互賦值 void*指針作為左值用于“接收”任意類型的

9、指針 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ì)算( sizeof) 3、可以給已存在的數(shù)據(jù)類型起別名 typedef 4、數(shù)據(jù)類型封裝概念( void 萬(wàn)能類型)思考 1:C 一維數(shù)組、二維數(shù)組有數(shù)據(jù)類型嗎?int arra

10、y10。若有,數(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ō)明原因。拋磚:變量概念概念:既能讀又能寫的內(nèi)存對(duì)象,稱為變量;若一旦初始化后不能修改的對(duì)象則稱 為常量。變量定義形式:類型 標(biāo)識(shí)符,標(biāo)識(shí)符,標(biāo)識(shí)符;例如:int x ; int wordCut , Radius , Height ; double FlightTime , Mileage , Speed ;

11、變量本質(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ù)據(jù); 3 不是向變量讀寫數(shù)據(jù),而是向變量所代表的內(nèi)存空間中寫數(shù)據(jù)。問(wèn): 變量跑哪去了?思考 1:變量三要素 (名稱、大小、作用域 ),變量的生命周期?思考2: C+編譯器是如何管理函數(shù)1,函數(shù)2變量之間的關(guān)系的?=引出兩

12、個(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;內(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)用模

13、型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)存空間能用嗎?)內(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): 指針做函 數(shù)參數(shù))=學(xué)習(xí)指針的技術(shù)路線圖1.5 內(nèi)存四區(qū)強(qiáng)化訓(xùn)練01 全局區(qū)訓(xùn)練char *p1=“ abcdef

14、g ”02 堆棧區(qū)生命周期訓(xùn)練Char p1=“ abcdefg ” 返回基本類型 返回非基本類型03 堆棧屬性訓(xùn)練測(cè)試 heap 生長(zhǎng)方向 測(cè)試 stack 生長(zhǎng)方向Heap、stack生長(zhǎng)方向和內(nèi)存存放方向是兩個(gè)不同概念野指針Malloc 得到指針釋放問(wèn)題測(cè)試free(p)free( p+1),深入理解1.6作業(yè)強(qiáng)化訓(xùn)練1劃出內(nèi)存四區(qū)void mai n26()char buf1OO;/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

15、; /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 * getstri ng1()char *p1 = "abcde"return p1;char * getstri ng2()char *p2 = "abcde"return p2;void mai n()int i= 0;/指針指向誰(shuí)就把誰(shuí)的地址賦給指針變量。char *p1 = getstri

16、 ng1();char *p2 = getstri ng2();char *p3 = NULL; /p3是個(gè)變量/指針變量和它所執(zhí)行的內(nèi)存空間變量是兩個(gè)不同的概念strcm p(p1, p 2);system(" pause");訓(xùn)練2劃出內(nèi)存四區(qū)void mai n01()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í)

17、區(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)存空間,用來(lái)保存內(nèi)存地址測(cè)試指針變量占有內(nèi)存空間大小2)*p操作內(nèi)存在指針聲明時(shí),*號(hào)表示所聲明的變量為指針 在指針使用時(shí),*號(hào)表示 操作 指針?biāo)赶虻膬?nèi)存空間中的值

18、*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ì)改變所指的內(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)存空

19、間的數(shù)據(jù)類型來(lái)確定P+= (un sig ned char )p+sizeof(a);結(jié)論:指針的步長(zhǎng),根據(jù)所指內(nèi)存空間類型來(lái)定。建立指針指向誰(shuí),就把把誰(shuí)的地址賦值給指針。圖和代碼和二為一。不斷的給指針變量賦值, 就是不斷的改變指針變量 (和所指向內(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í)參II改變0級(jí)

20、指針(int iNum = 1)的值有2種方式/改變1級(jí)指針(eg char *p = 0x1111 )的值,有2種方式II改變2級(jí)指針的(eg char *pp1 = 0x1111 )的值,有2種方式II函數(shù)調(diào)用時(shí),形參傳給實(shí)參,用實(shí)參取地址,傳給形參,在被調(diào)用函數(shù)里面用 *p,來(lái)改變實(shí)參,把運(yùn)算結(jié)果傳出來(lái)。II指針作為函數(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é)合 (指針做

21、函數(shù)參數(shù))編號(hào)針函數(shù)參數(shù)主調(diào)函數(shù)實(shí)參被調(diào)函數(shù)形參備注內(nèi)存分配方式(級(jí)別贏棧011級(jí)指針堆分配使用一般應(yīng)用禁 用(做輸入)棧分配使用常用Int showbuf(char *p);int showArray(i nt *array, int iNum)021級(jí)指針(做輸出)棧使用結(jié)果傳出常用int geLe n( char *pF ileName, int *p fileLe n);032級(jí)指針(做輸入)堆分配使用一般應(yīng)用禁 用棧分配使用常用int main (i nt arc ,char *arg); 指針數(shù)組int shouMatrix(i nt 34, i nt iLi ne);二維字符串?dāng)?shù)

22、組042級(jí)指針(做輸出)堆使用分配常用,但不 建議用,轉(zhuǎn)化成02int getData(char *data, int *dataLe n);Int getData_Free(void *data);Int getData_Free(void *data); / 避免野指針053級(jí)指針(做輸出)堆使用分配不常用int getFileAllLi ne(char *c onten t, i nt *pLin e);int getFileAllL in e_Free(char *c onten t, int *pLin e);指針做函數(shù)參數(shù),問(wèn)題的實(shí)質(zhì)不是指針,而是看內(nèi)存塊,內(nèi)存塊是1維、2維。1)

23、如果基礎(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 ,char *arg); 字符串?dāng)?shù)組int shouMatrix(int 34, int iLine

24、);二級(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: 三級(jí)指針輸出典型用法三級(jí)指針做輸出int getFileAllLine(char *content

25、, int *pLine);int getFileAIIL in e_Free(char *c onten t, i nt *pLin e);理解主調(diào)函數(shù)還是被調(diào)用函數(shù)分配內(nèi)存被調(diào)用函數(shù)是在heap/stack上分配內(nèi)存鐵律&雜項(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ù)求長(zhǎng)度;根據(jù)長(zhǎng)度,分配內(nèi)存,調(diào)用被調(diào)用 函數(shù)。3) 返回值 char */int

26、/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)典語(yǔ)錄】1)指針也是一種數(shù)據(jù)類型,指針的數(shù)據(jù)類型是指它所指向內(nèi)存空間的數(shù)據(jù)類型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)用問(wèn)題;它是你的工具。指針指向誰(shuí)就把誰(shuí)的地址賦給指針指針指向誰(shuí)就把誰(shuí)

27、的地址賦給指針,用它對(duì)付鏈表輕松加愉快鏈表入門的關(guān)鍵是分清楚鏈表操作和輔助指針變量之間的邏輯關(guān)系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)的指針啊。3字符串和一級(jí)指針內(nèi)存模型專題3.1字符串基本操作字符數(shù)組初始化方法int mai n11()1大號(hào)法初始化列表/數(shù)組初始化有2種方法默認(rèn)元素個(gè)數(shù)、指定元素個(gè)數(shù)char buf1 =

28、'a', 'b', 'c', 'd', 'e' II若沒(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'

29、;, 'c', 'd', 'e'prin tf("buf3:%s", buf3);system(” pause");在C語(yǔ)言中使用字符數(shù)組來(lái)模擬字符串C語(yǔ)言中的字符串是以0 '結(jié)束的字符數(shù)組C語(yǔ)言中的字符串可以分配于棧空間,堆空間或者只讀存儲(chǔ)區(qū)/在C語(yǔ)言中使用字符數(shù)組來(lái)模擬字符串/C語(yǔ)言中的字符串是以0 '結(jié)束的字符數(shù)組/C語(yǔ)言中的字符串可以分配于棧空間,堆空間或者只讀存儲(chǔ)區(qū) int mai n12()/1用字符串來(lái)初始化數(shù)組char buf2 = 'a', 'b',&

30、#39;c','d','O'/2字符串常量初始化一個(gè)字符數(shù)組char buf3 = "abcde" / 結(jié)論:會(huì)補(bǔ)充零char buf4 = "abcde"char buf5100 = "abcde"printf(” strle n(buf5) :%d 'n", strle n( buf5);printf(” sizeof(buf4) :%d n", sizeof(buf5);printf(” sizeof(buf4) :%d n", sizeof(buf4

31、);/strlen()求字符串的長(zhǎng)度,注意字符串的長(zhǎng)度不包含0sizeof(類型)字符串類型,的大小,包括 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 mai n13()int i = 0;char buf5100 = "abcde"char *p = NULL;/下標(biāo)法for (i=0; i<100; i+)prin tf(&quo

32、t;%c", buf5i);prin tf("n");/指針?lè)?for (i=0; i<100; i+)prin tf("%c", *(buf5+i);/buf5是個(gè)指針,是個(gè)常量指針/指針?lè)?prin tf("n");p = buf5;for (i=0; i<100; i+)prin tf("%c", *( p+i);/buf5是個(gè)指針,是個(gè)常量指針推演過(guò)程為:i變0+1,去號(hào)加*號(hào)/其實(shí)本質(zhì):指針*p間接尋址,操作內(nèi)存;/編譯器為我們做了 *p操作而已3.2字符串做函數(shù)參數(shù)深入理解指針。O

33、OOOOOOOOO的關(guān)鍵是什么?注意指針和數(shù)組的巨大區(qū)別char *p = abcdefg ”;Char *buf = abcdefg ”;一維字符串內(nèi)存模型:兩種void cop y_strO1(char *from, char *to)for (; *from!='0' from+, to+)*to = *from;*to = '0'void cop y_str02(char *from, char *to)while(*from!='0')*to+ = *from+;*to = '0'void cop y_str03(cha

34、r *from, char *to)while( (*to=*from) !='0')to+;from+;void cop y_strO4(char *from, char *to)while( (*to+=*from+) !='0') int cop y_str05_good(c onst char *from, char *to)if (from=NULL | to=NULL)prin tf("fu nc cop y_str05_good() err. (from=NULL | to=NULL)n");return -1;while( (

35、*to+=*from+) !='0')return 0;典型錯(cuò)誤知多少char *p = NULL;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 = 104字符串操作易錯(cuò)/你往哪里輸入數(shù)據(jù)int mai n()char

36、 buf2000;p = buf;printf("n請(qǐng)輸入一個(gè)字符串:”);scan f("%s", p);prin tf("%s", p);getcharO;getcharO;return 0;3.3庫(kù)函數(shù)api快速的上手api是一種能力!建立正確的程序運(yùn)行示意圖,(內(nèi)存四區(qū)及函數(shù)調(diào)用堆棧圖)是根本保障! !int mai n31()char buf11OO;char buf2200;strcpy(buf1, "111");prin tf("%s", strcat(buf1, "222&quo

37、t;);getchar();return 0;int mai n32()int len gth;/在字符str1中查找,與str2中任意字符有公共交集的位置len gth = strcs pn( stri ng1, stri ng2);char *stri ng2 = "747DC8"prin tf("Character where stri ngs in tersect is at po siti on %dn", le ngth);getcharO;return 0;/strnset函數(shù)有錯(cuò)誤/測(cè)試程序修改如下 int mai n33()char s

38、tri ng = "abcdefghijkl mnopq rstuvwxyz"char letter = 'x'prin tf("stri ng before strn set: %sn", stri ng);strn set(stri ng, letter, 13);prin tf("stri ng afterstrn set: %sn", stri ng);getchar();return 0;int main44()char *stri ng1 = "abcdefghijkl mnopq rstuvwx

39、yz"char *stri ng2 = "on m"ptr = strp brk(stri ng1, stri ng2);if (ptr)prin tf("str pbrk found first character: %cn", * ptr);char *ptr;elseprin tf("str pbrk did n't find character in setn");getcharO;return 0;int main 55()char inpu t16 = "abc,d"char*p;/*

40、 strtok p laces a NULL term in atorin front of the toke n, if found */p = strtok(i np ut,",");if (p)prin tf("%sn", p);/* A seco nd call to strtok usi ng a NULLas the first p arameter retur ns a pointerto the character follow ing the toke n*/p = strtok(NULL, ",");if (p)p

41、rin tf("%sn", p);getchar();return 0;/典型的狀態(tài)函數(shù) int mai n()3.4字符串相關(guān)一級(jí)指針內(nèi)存模型void main()charbuf20= "aaaa"charbuf2 = "bbbb"char*p1 ="111111"char*p2 = malloc(IOO); strc py(p2."3333");system( "pause");return3.5項(xiàng)目開(kāi)發(fā)字符串模型strstr-whiled owhil e 模型兩頭堵模型

42、字符串反轉(zhuǎn)模型3.6 一級(jí)指針(char *)易錯(cuò)模型分析Olchar * (字符串)做函數(shù)參數(shù)出錯(cuò)模型分析ooooo 一級(jí)指針你懂了。建立一個(gè)思想:是主調(diào)函數(shù)分配內(nèi)存,還是被調(diào)用函數(shù)分配內(nèi)存;/不要相信,主調(diào)函數(shù)給你傳的內(nèi)存空間,你可以寫。但是二級(jí)指針,你就不一定懂。o o 拋出 ooooooooovoid cop y_str21(char *from, char *to)if (*NULL = '0'II *to!=0 )for (; *from!='0' from+, to+)*to = '0'/字符串逆序 int mai n()/char

43、 p1024 =0;char *p =0; p = NULL;char to100;cop y_str21( p, to);C語(yǔ)言中沒(méi)有你不知道的,只有你不會(huì)調(diào)Java語(yǔ)言中沒(méi)有你不會(huì)調(diào)的,只有你不知道不斷修改內(nèi)存指針變量02越界03不斷修改指針變量的值for (; *from!= '0' ; from+, to+)*to = *from;*to ='0'printf("to:%s" , to);printf("from:%s" , from);簡(jiǎn)化算法*/簡(jiǎn)化算法*/char *z=str3;/*指針z指向數(shù)組str3*

44、/04你向外面?zhèn)鬟f什么1、臨時(shí)str3內(nèi)存空間/ char *str_c nct(x,y)/* / char *x,*y;char *str_c nct(char *x, char* y) /*char str380;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_c nct(char *x, char* y) /*簡(jiǎn)化算法*/char * str3= (char *)malloc(80)c

45、har *z=str3;/*指針z指向數(shù)組str3*/while(*z+=*x+);z-;/*去掉串尾結(jié)束標(biāo)志*/while(*z+=*y+);z=str3;/*將str3地址賦給指針變量z*/return(z);char *str_c nct(char *x, char* y) /*簡(jiǎn)化算法*/If (x = NULL)Retur n 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地址賦給指針變

46、量z*/ note:retum(z);Mai n ()Char *p = str_cnct( “abed” ,“ddeee” );If (p != NULL) Free( p) ;p = NULL/yezhizhen int getKeyByValude(char *keyvaluebuf, char *keybuf, char *valuebuf, i nt * valuebufle n)int result = 0;char *getbuf = new char100;memset(getbuf, 0, sizeof(getbuf);char *trimbuf = new char100;

47、memset(trimbuf, 0, sizeof(trimbuf);int destle n = strle n( keyvaluebuf);if (keybuf = NULL| keyvaluebuf = NULL| valuebuf = NULL/* | valuebuflen=NULL*/)result = -1;retur n result;if (strstr(keyvaluebuf, keybuf) = NULL)result = -1;retur n result;elsefor (i nt i = 0; i < destle n; i+)if (*keyvaluebuf

48、 ='=')*keyvaluebuf+;break;keyvaluebuf+;while(*keyvaluebuf != '0')*valuebuf = *keyvaluebuf;valuebuf+;keyvaluebuf+;*valuebuf = '0:int len = strle n( valuebuf);retur n result;/char *p = "abcd11111abcd2222abcdqqqqq" / 字符串中"abed"出現(xiàn)的次數(shù)。/要求你 自己寫一個(gè)函數(shù)接口,并且寫出測(cè)試用例。/完成功能為

49、:求出"abcd”字串出現(xiàn)的次數(shù)/輸入:int getSubCo un t(char *str, char *substr, i nt *myco 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

50、, sub);if (p!= NULL)coun t+;/+后綴操作符優(yōu)先級(jí)高,所以先執(zhí)行*p操作 然后地址+*myco un t+;p = p + strle n( sub);elsebreak; while (*p != '0');/prin tf("cou nt:%d 'n", cou nt);/mycount是實(shí)參的地址 * (實(shí)參的地址)*myco unt = count;return ret;05看圖06重復(fù)的錯(cuò)誤何時(shí)休#in clude "stdio.h"#in clude "stdlib.h"#

51、i nclude "stri ng.h"void cop y_str21_modify(char *from, char *to)int i = 0;if (*from != '0')prin tf("ddddd");for (; *from!='0' from+, to+)*to = *from;*to = '0'prin tf("to:%s", to);prin tf("from:%s", from);void cop y_str_err(char *from,

52、char *to)for (; *from!='0' from+, to+)*to = *from;*to = '0'prin tf("to:%s", to);prin tf("from:%s", from);/字符串逆序int main aaaa()char buf1100 = "abcdefg"char to100;cop y_str_err(buf1, to);/越界場(chǎng)景int mai n00000000000()char from5 = "abcde"prin tf(&quo

53、t;n %s",from);getchar();return 0;3.7const 專題1、con st基礎(chǔ)知識(shí)(用法、含義、好處、擴(kuò)展)int mai n()const int a; /int const b;const char *c;char * con st d; char buf100const char * const e ;return 0;Int fun c1(c onst )初級(jí)理解:const是定義常量=con st意味著只讀含義:/第一個(gè)第二個(gè)意思一樣代表一個(gè)常整形數(shù)/第三個(gè)c是一個(gè)指向常整形數(shù)的指針(所指向的內(nèi)存數(shù)據(jù)不能被修改,但是本身可以修改 /第四個(gè)d常指

54、針(指針變量不能被修改,但是它所指向內(nèi)存空間可以被修改) /第五個(gè)e 一個(gè)指向常整形的常指針(指針和它所指向的內(nèi)存空間,均不能被修改)Con st好處 /合理的利用con st,bug;1指針做函數(shù)參數(shù),可以有效的提高代碼可讀性,減少 2清楚的分清參數(shù)的輸入和輸出特性 結(jié)論:/指針變量和它所指向的內(nèi)存空間變量,是兩個(gè)不同的概念。/看const是放在*的左邊還是右邊 看con st是修飾指針變量,還是修飾所指向的內(nèi)存空變 量3.8考試強(qiáng)化訓(xùn)練1、有一個(gè)字符串開(kāi)頭或結(jié)尾含有n個(gè)空格(” abcdefgdddd”),欲去掉前后空格,返回一個(gè)新字符串。要求1:請(qǐng)自己定義一個(gè)接口(函數(shù)),并實(shí)現(xiàn)功能;7

55、0分 要求2 :編寫測(cè)試用例。30分int trims pace(char *in buf, char *outbuf);2、有一個(gè)字符串 ”1a2b3d4z”,;要求寫一個(gè)函數(shù)實(shí)現(xiàn)如下功能,功能1:把偶數(shù)位字符挑選出來(lái),組成一個(gè)字符串1。 valude; 20 分功能2:把奇數(shù)位字符挑選出來(lái),組成一個(gè)字符串2, valude 20功能3:把字符串 1 和字符串 2,通過(guò)函數(shù)參數(shù),傳送給 main ,并打印。功能4:主函數(shù)能測(cè)試通過(guò)。int getStr1Str2(char *souce, char *buf1, char *buf2);3、鍵值對(duì)( ”key = valude ”)字符串,在開(kāi)發(fā)中經(jīng)常使用;要求 1:請(qǐng)自己定義一個(gè)接口,實(shí)現(xiàn)根據(jù)key 獲取 valude ;40 分要求 2:編寫測(cè)試用

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論