C++大學(xué)教程指針和基本指針的字符串_第1頁
C++大學(xué)教程指針和基本指針的字符串_第2頁
C++大學(xué)教程指針和基本指針的字符串_第3頁
C++大學(xué)教程指針和基本指針的字符串_第4頁
C++大學(xué)教程指針和基本指針的字符串_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++UniversityTutorial指針和基于指針的字符串深入理解內(nèi)存地址、指針操作與字符串處理Contents課程目錄系統(tǒng)掌握C語言指針的核心概念與實(shí)際應(yīng)用01指針基礎(chǔ)概念02指針的聲明與操作03指針與數(shù)組04指針與函數(shù)05基于指針的字符串CHAPTER01指針基礎(chǔ)概念從內(nèi)存地址到指針變量,建立底層思維模型C++FUNDAMENTALS指針:地址即數(shù)據(jù)指針的核心思想是將內(nèi)存地址視為一種可存儲(chǔ)、可傳遞的數(shù)據(jù)類型。理解"地址即數(shù)據(jù)"這一觀念是掌握指針的第一步,它打破了"變量只能存值"的傳統(tǒng)認(rèn)知,為間接訪問內(nèi)存奠定了理論基礎(chǔ)。01intx1000內(nèi)存中每個(gè)變量都有唯一的地址編號(hào),如intx可能被分配在1000號(hào)單元,該地址本身就是一個(gè)可操作的數(shù)值。02地址作為數(shù)據(jù)可以被存儲(chǔ)在另一個(gè)變量中,這個(gè)專門存放地址的變量就是指針變量。03指針的本質(zhì)是"指向"關(guān)系:通過存儲(chǔ)目標(biāo)變量的地址,實(shí)現(xiàn)對(duì)目標(biāo)變量的間接訪問和操作。04這種"地址即數(shù)據(jù)"的設(shè)計(jì)使C++能夠直接操作內(nèi)存,賦予了程序員極大的靈活性和底層控制力。計(jì)算機(jī)內(nèi)存條DDR5實(shí)物特寫CONCEPT指針變量與變量的指針'指針變量'是存儲(chǔ)地址的變量本身,而'變量的指針'是指向某個(gè)特定變量的指針。前者強(qiáng)調(diào)變量類型,后者強(qiáng)調(diào)指向關(guān)系。01指針變量是類型為"指針"的變量,其存儲(chǔ)的內(nèi)容不是普通數(shù)值,而是另一個(gè)變量的內(nèi)存地址02"變量的指針"強(qiáng)調(diào)指向關(guān)系,如px存儲(chǔ)了x的地址1000,則稱px為x的指針,px指向x03內(nèi)存模型中常用箭頭表示指向關(guān)系:指針變量框中寫地址值,箭頭指向目標(biāo)變量的存儲(chǔ)框04實(shí)際編程中變量的真實(shí)地址由操作系統(tǒng)動(dòng)態(tài)分配,教學(xué)時(shí)常用簡化地址(如1000)來描述指針編程教學(xué)課堂實(shí)景MemoryModel指針的內(nèi)存模型指針變量本身也占用內(nèi)存空間,其存儲(chǔ)的內(nèi)容是目標(biāo)變量的地址。通過"讀取指針值→定位目標(biāo)地址→獲取目標(biāo)數(shù)據(jù)"的三步過程實(shí)現(xiàn)間接訪問,這是指針操作的核心機(jī)制。內(nèi)存布局示例01變量x分配在1000號(hào)單元,存儲(chǔ)值為2;指針變量px分配在1004號(hào)單元,存儲(chǔ)值為1000。這種分離存儲(chǔ)體現(xiàn)了"指針即地址"的本質(zhì)特性。02指針變量自身也占內(nèi)存:32位系統(tǒng)上占4字節(jié),64位系統(tǒng)上占8字節(jié),與普通變量一樣擁有獨(dú)立的內(nèi)存地址,同樣需要存儲(chǔ)空間來保存地址數(shù)據(jù)。03px地址是1004,px的值是1000,*px(解引用)結(jié)果是2,構(gòu)成完整的"指針→地址→數(shù)據(jù)"三級(jí)指向鏈。間接訪問機(jī)制01直接訪問:通過變量名x直接讀取1000號(hào)單元的值,編譯器在編譯期自動(dòng)完成變量名到內(nèi)存地址的映射轉(zhuǎn)換,訪問路徑最短。02間接訪問:通過指針px先獲取存儲(chǔ)的地址1000,再以該地址為目標(biāo)讀取實(shí)際數(shù)據(jù),相比直接訪問多了一層"尋址"步驟。03間接訪問的核心價(jià)值在于:程序可以在運(yùn)行時(shí)動(dòng)態(tài)決定訪問哪個(gè)變量,實(shí)現(xiàn)靈活的數(shù)據(jù)操作,支持動(dòng)態(tài)內(nèi)存分配、函數(shù)參數(shù)傳遞、數(shù)據(jù)結(jié)構(gòu)構(gòu)建等高級(jí)編程模式。MemoryModel為什么需要指針指針存在的核心價(jià)值在于三個(gè)方面:實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配、提升大數(shù)據(jù)量傳遞的效率、以及構(gòu)建鏈表和樹等復(fù)雜數(shù)據(jù)結(jié)構(gòu)。指針賦予C++直接操控內(nèi)存的能力,是系統(tǒng)級(jí)編程和高性能計(jì)算的基石。動(dòng)態(tài)內(nèi)存管理通過new/delete在堆區(qū)按需分配和釋放內(nèi)存,解決編譯期無法確定數(shù)據(jù)規(guī)模的問題高效參數(shù)傳遞傳遞指針(地址)而非復(fù)制整個(gè)數(shù)據(jù)對(duì)象,對(duì)大型結(jié)構(gòu)體和數(shù)組可顯著降低內(nèi)存和時(shí)間開銷構(gòu)建復(fù)雜數(shù)據(jù)結(jié)構(gòu)鏈表、二叉樹、圖等數(shù)據(jù)結(jié)構(gòu)依賴指針建立節(jié)點(diǎn)間的邏輯連接,無指針則無法實(shí)現(xiàn)底層硬件交互操作系統(tǒng)、驅(qū)動(dòng)程序和嵌入式開發(fā)需通過指針直接訪問特定內(nèi)存地址來操控硬件寄存器系統(tǒng)級(jí)編程的底層基礎(chǔ)設(shè)施CHAPTER02指針的聲明與操作掌握指針變量的定義、初始化與核心運(yùn)算符SyntaxFundamentals指針變量的聲明指針變量的聲明使用"類型標(biāo)識(shí)符*變量名"格式,星號(hào)表明該變量存儲(chǔ)的是地址而非普通值。聲明多個(gè)指針變量時(shí)每個(gè)變量名前都必須加星號(hào),這是初學(xué)者最常見的語法陷阱之一。01基本語法為"類型標(biāo)識(shí)符*指針變量名",如int*intp聲明指向整數(shù)的指針,char*chPtr聲明指向字符的指針。類型*名稱02類型標(biāo)識(shí)符決定了指針指向的數(shù)據(jù)類型,編譯器據(jù)此確定解引用時(shí)讀取多少字節(jié)以及如何解釋數(shù)據(jù)。字節(jié)寬度03同時(shí)聲明多個(gè)指針變量時(shí),每個(gè)變量名前的星號(hào)不可省略:double*p,*q正確,double*p,q則q為普通變量。逐個(gè)加*04聲明時(shí)指針變量未初始化則包含隨機(jī)地址值(野指針),使用前必須賦初值或置為nullptr以避免未定義行為。野指針PointerOperators核心運(yùn)算符:&和*取地址運(yùn)算符&獲取變量的內(nèi)存地址,解引用運(yùn)算符*通過指針訪問目標(biāo)變量的值。兩個(gè)運(yùn)算符互為逆操作。Operator取地址運(yùn)算符&語法為&變量名,返回該變量在內(nèi)存中的地址值,如px=&x將x的地址存入指針px不能用常數(shù)對(duì)指針直接賦值(如px=1000是錯(cuò)誤的),因?yàn)榫幾g器無法驗(yàn)證該地址的合法性&運(yùn)算符的結(jié)果類型是"指向該變量類型的指針",如&x(x為int)的類型是int*Operator解引用運(yùn)算符*語法為*指針變量,訪問指針?biāo)赶虻刂诽幋鎯?chǔ)的值,如*px等價(jià)于x(當(dāng)px=&x時(shí))可通過*修改目標(biāo)變量的值:*px=10等同于x=10,這是指針實(shí)現(xiàn)"間接修改"的關(guān)鍵能力聲明中的*與使用中的*含義不同:int*px的*是類型修飾,*px=5的*是解引用運(yùn)算符C++Pointers指針的賦值與運(yùn)算同類型指針之間可以賦值和比較,指針還可以進(jìn)行算術(shù)運(yùn)算(加減整數(shù))。指針?biāo)阈g(shù)的單位是目標(biāo)類型的大小而非字節(jié)數(shù),這一特性使指針能夠自然地遍歷數(shù)組元素。01指針賦值要求類型匹配:int*p1=&x,*p2=p1使兩個(gè)指針指向同一變量,此后修改*p2會(huì)影響x和*p102指針比較運(yùn)算:==和!=判斷是否指向同一地址,<和>比較地址高低,常用于數(shù)組遍歷的終止條件判斷03指針?biāo)阈g(shù)以目標(biāo)類型大小為單位:int*p執(zhí)行p+1地址增加4字節(jié),double*p執(zhí)行p+1地址增加8字節(jié)04同類型指針相減:結(jié)果為兩地址間可容納的目標(biāo)類型元素個(gè)數(shù),常用于計(jì)算數(shù)組長度編程實(shí)踐場(chǎng)景·指針操作的實(shí)際編碼過程C++FUNDAMENTALS指針與const的三種組合const與指針的組合產(chǎn)生三種不同的約束,掌握這三種組合是編寫安全C++代碼的基礎(chǔ)。指向常量的指針constint*p=&value不能通過*p修改目標(biāo)值,但p可以重新指向其他變量常用于函數(shù)參數(shù)保護(hù),保證函數(shù)內(nèi)部不會(huì)修改調(diào)用方的數(shù)據(jù)值只讀常量指針int*constp=&xp的指向一旦初始化就不可更改,但可通過*p修改x的值必須在聲明時(shí)初始化,類似于引用的不可重綁定特性指向鎖定指向常量的常量指針constint*constp=&y既不能通過*p修改值,也不能讓p指向其他變量適用于固定訪問只讀數(shù)據(jù)的場(chǎng)景,提供最高級(jí)別的數(shù)據(jù)保護(hù)雙重鎖定PointerSafety空指針、野指針與懸空指針指針安全編程的三大風(fēng)險(xiǎn)是空指針、野指針和懸空指針。C++11引入的nullptr提供了類型安全的空指針表示。遵循"初始化置空、使用前檢查、釋放后歸零"三原則可有效避免指針相關(guān)的未定義行為??罩羔榥ullptrC++11引入的類型安全空指針,表示不指向任何有效對(duì)象,解引用將導(dǎo)致程序崩潰(段錯(cuò)誤)。相比傳統(tǒng)NULL宏,nullptr具有明確的指針類型,可避免重載解析歧義。C++11標(biāo)準(zhǔn)·類型安全野指針未初始化的指針變量包含隨機(jī)垃圾地址,解引用后行為不可預(yù)測(cè),是最難調(diào)試的指針錯(cuò)誤之一。常見于棧上未初始化指針、malloc后未賦值直接使用等場(chǎng)景。最難調(diào)試·未定義行為懸空指針指向已被delete釋放內(nèi)存的指針,該內(nèi)存可能已被重新分配,訪問會(huì)導(dǎo)致數(shù)據(jù)損壞或崩潰。即使程序暫時(shí)運(yùn)行正常,也可能在后續(xù)觸發(fā)難以復(fù)現(xiàn)的內(nèi)存錯(cuò)誤。delete后殘留·內(nèi)存風(fēng)險(xiǎn)安全編程三原則聲明時(shí)初始化為nullptr、使用前檢查if(p!=nullptr)、delete后立即將指針置為nullptr。配合智能指針(unique_ptr/shared_ptr)可進(jìn)一步實(shí)現(xiàn)自動(dòng)化內(nèi)存管理。初始化·檢查·歸零·智能指針C++MEMORY動(dòng)態(tài)內(nèi)存管理:new與deletenew在堆區(qū)動(dòng)態(tài)分配內(nèi)存并返回指針,delete釋放已分配的內(nèi)存。每次new必須有配對(duì)的delete,數(shù)組形式new[]必須配對(duì)delete[]。單個(gè)對(duì)象的動(dòng)態(tài)分配●int*p=newint(42)—在堆區(qū)分配一個(gè)int大小的內(nèi)存并初始化為42,p指向該內(nèi)存●deletep—釋放p指向的堆區(qū)內(nèi)存,歸還給系統(tǒng);釋放后p變?yōu)閼铱罩羔?,?yīng)立即置nullptrnew/delete數(shù)組的動(dòng)態(tài)分配●int*arr=newint[n]—在堆區(qū)分配n個(gè)int的連續(xù)空間,n可以是運(yùn)行時(shí)變量,突破棧區(qū)大小限制●delete[]arr—釋放動(dòng)態(tài)數(shù)組必須使用方括號(hào)形式,僅用delete會(huì)導(dǎo)致只釋放首元素,其余內(nèi)存泄漏new[]/delete[]常見風(fēng)險(xiǎn)與防范●內(nèi)存泄漏—new后忘記delete,長期運(yùn)行程序會(huì)耗盡系統(tǒng)內(nèi)存;可用智能指針自動(dòng)管理生命周期●重復(fù)釋放—對(duì)同一指針執(zhí)行兩次delete導(dǎo)致未定義行為;釋放后置nullptr可安全避免此問題Leak/Double-freeMemoryManagement智能指針:現(xiàn)代C++的內(nèi)存管理方案C++11引入的智能指針(unique_ptr和shared_ptr)通過RAII機(jī)制自動(dòng)管理動(dòng)態(tài)內(nèi)存,在離開作用域時(shí)自動(dòng)釋放資源。智能指針幾乎消除了手動(dòng)delete帶來的內(nèi)存泄漏風(fēng)險(xiǎn),是現(xiàn)代C++推薦的所有權(quán)管理方式。獨(dú)占所有權(quán)同一對(duì)象只能有一個(gè)unique_ptr擁有,離開作用域自動(dòng)delete,支持move轉(zhuǎn)移所有權(quán)unique_ptr共享所有權(quán)多個(gè)shared_ptr可指向同一對(duì)象,內(nèi)部引用計(jì)數(shù)歸零時(shí)自動(dòng)釋放,適合多處共享資源shared_ptr工廠函數(shù)make_shared<int>(42)一次分配對(duì)象和控制塊,比直接new更高效且異常安全make_shared局限與風(fēng)險(xiǎn)不適合非內(nèi)存資源管理,循環(huán)引用時(shí)shared_ptr會(huì)導(dǎo)致泄漏,需用weak_ptr打破weak_ptrC/C++POINTER多級(jí)指針多級(jí)指針即指向指針的指針,通過多次解引用逐層訪問數(shù)據(jù)。二級(jí)指針(**)是最常見形式。二級(jí)指針聲明int**pptr=&ptr,pptr存儲(chǔ)ptr的地址,**pptr經(jīng)兩次解引用得到最終值。多級(jí)指針聲明時(shí),星號(hào)數(shù)量對(duì)應(yīng)解引用層級(jí)。**pptr函數(shù)中修改指針需在函數(shù)內(nèi)改變傳入指針的指向而非指向的值時(shí),參數(shù)類型必須是指針的指針。通過二級(jí)指針可在函數(shù)內(nèi)部修改外部指針變量本身。參數(shù)類型命令行參數(shù)argvmain函數(shù)的argv是二級(jí)指針,每個(gè)*argv[i]指向一個(gè)命令行參數(shù)字符串。argc記錄參數(shù)個(gè)數(shù),argv[0]通常為程序名。char**argv動(dòng)態(tài)二維數(shù)組先分配行指針數(shù)組再逐行分配列空間,實(shí)現(xiàn)靈活的矩陣存儲(chǔ)與動(dòng)態(tài)內(nèi)存管理。釋放時(shí)需先逐行釋放再釋放行指針數(shù)組。int**matrixCHAPTER03指針與數(shù)組揭示數(shù)組名的指針本質(zhì)與指針?biāo)阈g(shù)的遍歷技巧C·PointerSemantics數(shù)組名的指針特性數(shù)組名在表達(dá)式中自動(dòng)退化為指向首元素的常量指針(等價(jià)于&arr[0]),但數(shù)組名本身不可被重新賦值。這一特性使指針能夠自然地訪問數(shù)組元素,也是數(shù)組傳參時(shí)退化為指針的根本原因。01數(shù)組名退化為指針intarr[5]arr&arr[0]int*intarr[5]中arr等價(jià)于&arr[0],類型為int*,指向數(shù)組第一個(gè)元素。這是C語言數(shù)組設(shè)計(jì)的核心機(jī)制,使得數(shù)組能夠以指針形式參與運(yùn)算。02數(shù)組名是常量指針arrarr++arr=parr的指向固定不可變,arr++和arr=p均非法,編譯器會(huì)報(bào)錯(cuò)。只有普通指針變量才能做移動(dòng)操作,數(shù)組名始終綁定到固定的內(nèi)存地址。03sizeof的區(qū)別sizeof(arr)sizeof(p)sizeof(arr)返回整個(gè)數(shù)組字節(jié)數(shù)(如5×4=20),而sizeof(p)僅返回指針本身大小(4或8字節(jié))。這是區(qū)分?jǐn)?shù)組和指針的關(guān)鍵手段,常用于計(jì)算數(shù)組元素個(gè)數(shù)。04取數(shù)組地址的特殊性&arrint(*)[5]arrint*&arr類型為int(*)[5](指向整個(gè)數(shù)組的指針),與arr退化后的int*不同。兩者步長不同,前者移動(dòng)跳過整個(gè)數(shù)組,后者移動(dòng)跳過一個(gè)元素。C/C++·PointerArithmetic指針?biāo)阈g(shù)與數(shù)組遍歷下標(biāo)運(yùn)算符arr[i]在編譯器內(nèi)部被轉(zhuǎn)換為*(arr+i),本質(zhì)是指針?biāo)阈g(shù)加解引用。利用指針遞增可以高效遍歷數(shù)組,指針每加1自動(dòng)前進(jìn)一個(gè)元素大小的字節(jié)數(shù),無需手動(dòng)計(jì)算偏移。等價(jià)訪問方式01arr[i]*(arr+i)arr[i]等價(jià)于*(arr+i):下標(biāo)運(yùn)算符本質(zhì)是指針偏移加解引用,這是C/C++的核心設(shè)計(jì)哲學(xué)02p[i]*(p+i)p[i]等價(jià)于*(p+i):當(dāng)p指向數(shù)組首元素時(shí),p可以像數(shù)組名一樣使用下標(biāo)訪問03i[arr]*(i+arr)i[arr]也等價(jià)于*(i+arr):由于加法交換律,這種奇特寫法合法但不推薦,影響代碼可讀性指針遍歷技巧01ptr++sizeof(int)ptr++遍歷數(shù)組,每次自動(dòng)前進(jìn)sizeof(int)字節(jié),無需手動(dòng)計(jì)算偏移02ptr<arr+n指針比較ptr<arr+n作為循環(huán)條件,利用地址的有序性判斷是否到達(dá)數(shù)組末尾03arr+i指針遍歷底層效率略優(yōu)于下標(biāo)遍歷,省去了每次計(jì)算arr+i的加法操作CStringFundamentals字符數(shù)組與C風(fēng)格字符串C風(fēng)格字符串是以'\0'終止符結(jié)尾的字符數(shù)組,字符串處理函數(shù)通過遍歷指針直到遇到'\0'來確定字符串長度。理解字符數(shù)組的內(nèi)存布局是掌握基于指針的字符串操作的前提。01chars[]="hello"{'h','e','l','l','o','\0'}字符串本質(zhì)是字符數(shù)組:chars[]="hello"在內(nèi)存中存儲(chǔ)為{'h','e','l','l','o','\0'},共6個(gè)字節(jié)6bytes02strlen'\0'終止符是字符串的核心標(biāo)記:strlen等函數(shù)從首字符開始逐字節(jié)掃描,遇到'\0'停止并返回長度strlen()03chars[]="abc"constchar*p="abc"字符數(shù)組與字符串常量的區(qū)別:chars[]="abc"可修改,constchar*p="abc"指向只讀區(qū)不可修改可變vs只讀04chars[5]="hello"常見陷阱:忘記預(yù)留'\0'的空間導(dǎo)致越界,如chars[5]="hello"沒有空間放終止符,后續(xù)操作將產(chǎn)生未定義行為UB風(fēng)險(xiǎn)CHAPTER04指針與函數(shù)引用調(diào)用、返回指針的函數(shù)與函數(shù)指針回調(diào)機(jī)制C++指針·函數(shù)參數(shù)值傳遞與引用調(diào)用C++默認(rèn)的值傳遞只復(fù)制實(shí)參副本,函數(shù)內(nèi)修改不影響原始變量。通過傳遞指針實(shí)現(xiàn)"引用調(diào)用",函數(shù)可以間接修改調(diào)用方的數(shù)據(jù),這是指針在函數(shù)編程中最基礎(chǔ)也最重要的應(yīng)用。值傳遞的局限COPYvoidswap(inta,intb)voidswap(inta,intb)只交換形參副本,實(shí)參x、y的值在函數(shù)調(diào)用前后保持不變COST值傳遞對(duì)大型對(duì)象效率低下:傳遞一個(gè)1000字節(jié)的結(jié)構(gòu)體需要完整復(fù)制,浪費(fèi)時(shí)間和內(nèi)存1000bytes指針實(shí)現(xiàn)引用調(diào)用ADDRESSvoidswap(int*a,int*b)swap(&x,&y)voidswap(int*a,int*b)接收實(shí)參地址,通過*a和*b直接修改原始變量,調(diào)用方式為swap(&x,&y)EFFICIENT指針傳參只傳遞一個(gè)地址(4或8字節(jié)),無論目標(biāo)數(shù)據(jù)多大都不會(huì)產(chǎn)生復(fù)制開銷4–8bytesMULTI-RETURN引用調(diào)用使函數(shù)能夠返回多個(gè)結(jié)果:通過多個(gè)指針參數(shù)同時(shí)修改多個(gè)外部變量C++POINTER返回指針的函數(shù)函數(shù)可以返回指針類型,但絕不能返回局部變量的地址,因?yàn)榫植孔兞吭诤瘮?shù)退出后已被銷毀。安全的返回對(duì)象包括動(dòng)態(tài)分配的堆內(nèi)存、傳入的指針參數(shù)和靜態(tài)/全局變量的地址。01函數(shù)返回指針的語法:int*findMax(int*arr,intsize),返回類型為int*,表示返回一個(gè)整數(shù)地址。02致命錯(cuò)誤:返回局部變量地址(如intx=5;return&x)會(huì)導(dǎo)致懸空指針,訪問已銷毀的內(nèi)存產(chǎn)生未定義行為。03安全方式一:返回new分配的堆區(qū)內(nèi)存,如returnnewint(result),調(diào)用方負(fù)責(zé)delete。04安全方式二:返回傳入的指針參數(shù)(如數(shù)組元素地址)或static/全局變量地址,生命周期不受函數(shù)限制。大學(xué)計(jì)算機(jī)實(shí)驗(yàn)室·學(xué)生編程實(shí)景SYNTAX&PATTERN函數(shù)指針函數(shù)指針存儲(chǔ)函數(shù)的入口地址,使程序能夠在運(yùn)行時(shí)動(dòng)態(tài)選擇調(diào)用哪個(gè)函數(shù)。函數(shù)指針是實(shí)現(xiàn)回調(diào)機(jī)制、策略模式和事件驅(qū)動(dòng)架構(gòu)的核心工具,廣泛應(yīng)用于標(biāo)準(zhǔn)庫函數(shù)和框架設(shè)計(jì)中。聲明與使用01聲明語法:返回類型(*指針名)(參數(shù)列表),如int(*fp)(int,int)聲明指向雙參數(shù)整型函數(shù)的指針02賦值與調(diào)用:fp=add將函數(shù)地址賦給fp,調(diào)用時(shí)fp(3,5)或(*fp)(3,5)均可int(*fp)()核心應(yīng)用場(chǎng)景回調(diào)機(jī)制:將函數(shù)指針作為參數(shù)傳入,讓調(diào)用方在適當(dāng)時(shí)機(jī)執(zhí)行自定義邏輯,如qsort的比較函數(shù)策略模式:根據(jù)運(yùn)行時(shí)條件選擇不同的函數(shù)指針,實(shí)現(xiàn)行為的動(dòng)態(tài)切換,避免大量if-else分支事件驅(qū)動(dòng):在GUI編程和游戲引擎中,事件處理器通過函數(shù)指針注冊(cè),事件觸發(fā)時(shí)自動(dòng)回調(diào)qsort·Strategy·EventFunctionPointerArray函數(shù)指針數(shù)組與應(yīng)用函數(shù)指針數(shù)組將多個(gè)同類型函數(shù)組織為可索引的表,通過下標(biāo)動(dòng)態(tài)選擇調(diào)用目標(biāo)。這種設(shè)計(jì)消除了冗長的switch-case結(jié)構(gòu),使程序更具擴(kuò)展性,是實(shí)現(xiàn)命令分發(fā)和插件機(jī)制的常用技巧。聲明語法返回類型(*數(shù)組名[大小])(參數(shù)列表),如int(*ops[4])(int,int)定義含4個(gè)函數(shù)指針的數(shù)組。括號(hào)優(yōu)先級(jí)決定數(shù)組特性,是C語言函數(shù)指針的核心語法。Syntax計(jì)算器應(yīng)用將add、sub、mul、div四個(gè)函數(shù)指針存入數(shù)組,通過ops[choice](a,b)直接分發(fā)調(diào)用。用戶輸入操作符索引,程序自動(dòng)路由到對(duì)應(yīng)函數(shù)執(zhí)行運(yùn)算。Dispatch擴(kuò)展性優(yōu)勢(shì)新增操作只需追加函數(shù)和指針,無需修改分發(fā)邏輯,符合開閉原則。相比switch-case的硬編碼,函數(shù)指針數(shù)組讓代碼更易維護(hù)和擴(kuò)展。Open-ClosedTypedef簡化typedefint(*FuncPtr)(int,int)簡化聲明,F(xiàn)uncPtrops[4]更清晰易讀。類型別名隱藏復(fù)雜語法細(xì)節(jié),提升代碼可讀性,是大型項(xiàng)目的最佳實(shí)踐。ReadabilityCHAPTER05基于指針的字符串字符指針初始化、字符串操作與C標(biāo)準(zhǔn)庫函數(shù)CLANGUAGE·POINTER字符串指針的初始化方式字符指針可以通過字符數(shù)組或字符串字面量兩種方式初始化。數(shù)組方式在棧區(qū)分配可修改的內(nèi)存,字面量方式指向只讀數(shù)據(jù)區(qū)不可修改。理解兩種方式的內(nèi)存分布差異是避免字符串操作錯(cuò)誤的關(guān)鍵。字符數(shù)組方式可修改01chars[4]={'a','b','c','\0'}'\0'chars[4]={'a','b','c','\0'}顯式列出每個(gè)字符,必須手動(dòng)添加'\0'終止符02chars[]="abc"'\0'chars[]="abc"編譯器自動(dòng)計(jì)算大小并添加'\0',數(shù)據(jù)存儲(chǔ)在棧區(qū)可自由修改03數(shù)組名s是常量指針,不能指向其他內(nèi)存,但數(shù)組內(nèi)容可通過下標(biāo)或指針運(yùn)算任意修改STACK·WRITABLE字符串字面量方式只讀01constchar*p="abc""abc\0"constchar*p="abc"系統(tǒng)在只讀數(shù)據(jù)區(qū)分配空間存儲(chǔ)"abc\0",將起始地址賦給p02*p='x'p指向的內(nèi)容不可修改(*p='x'會(huì)崩潰),但p本身可重新指向其他字符串03多個(gè)指向相同字面量的指針可能共享同一內(nèi)存地址(編譯器優(yōu)化),修改會(huì)影響所有引用READ-ONLY·SHAREDC++InputMethods字符串的讀入方式cin>>以空白字符為分隔讀入單詞,無法處理含空格的字符串;cin.getline()讀入整行直到換行符,是處理完整句子的正確方式。01cin>>s以空白字符(空格、Tab、換行)為終止條件,每次只讀入一個(gè)單詞,剩余內(nèi)容留在輸入緩沖區(qū)單詞級(jí)讀取02cin.getline(s,n)讀入最多n-1個(gè)字符直到遇到換行符,自動(dòng)添加'\0',可正確處理含空格的完整句子整行讀取03混合使用陷阱cin>>后緊跟getline時(shí),前者遺留的換行符會(huì)被后者立即讀取為空行,需用cin.ignore()清除cin.ignore()04gets()已廢棄無法限制讀入長度導(dǎo)致緩沖區(qū)溢出風(fēng)險(xiǎn),C++14起已從標(biāo)準(zhǔn)庫中徹底移除緩沖區(qū)溢出STANDARDLIBRARYC標(biāo)準(zhǔn)庫字符串函數(shù)C標(biāo)準(zhǔn)庫的字符串函數(shù)全部基于字符指針實(shí)現(xiàn),通過遍歷指針直到'\0'來操作字符串。使用時(shí)必須確保目標(biāo)緩沖區(qū)足夠大,否則極易引發(fā)緩沖區(qū)溢出安全漏洞。LENGTH©strlen(s)逐字節(jié)掃描至'\0',返回字符個(gè)數(shù),時(shí)間復(fù)雜度O(n)strcpy(dest,src)逐字符復(fù)制到dest直到'\0',dest空間不足則溢出O(n)CONCAT&COMPAREstrcat(dest,src)找到dest的'\0'位置追加src,需容納拼接總長度strcmp(s1,s2)逐字符比較ASCII值,返回0/正/負(fù)值表示大小關(guān)系A(chǔ)SCIISAFEALTERNATIVESstrn*系列strncpy、strncat、strncmp增加長度限制n,防止溢出std::string現(xiàn)代C++推薦替代方案,自動(dòng)管理內(nèi)存且接口豐富SAFECPointerTechniques指針處理字符串的經(jīng)典技巧利用字符指針和'\0'終止符的特性,可以實(shí)現(xiàn)無需預(yù)知長度的字符串遍歷、反轉(zhuǎn)和回文判斷等算法。雙指針技術(shù)(首尾各一個(gè)指針向中間逼近)是字符串處理中最常用的指針編程范式。指針遍歷while(*p){process(*p);p++;}利用'\0'值為0的特性作為循環(huán)終止條件,簡潔高效while(*p)字符串反轉(zhuǎn)設(shè)head指向首字符、tail指向'\0'前一個(gè)字符,交換*head和*tail

溫馨提示

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