




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C++〔變量〕本章主要介紹幾個概念變量和常量:bool、char、int、short、long、float、double,留意個變量的所占的字節數。cons區分。#defineMAX 100 //宏常量constintMAX=100; // C++constchar*p=“helloworld“; //字符串常量全局變量和靜態變量extern關鍵字再次聲明這個全局變量。量。靜態全局變量作用于其定義它的源文件里,不能作用到其它源文件,即被static數體始終可見。即假設全局變量加上static,static,則轉變其內存存儲位置,不轉變其作用域。調用時,如何實現?最簡潔想到的方法是定義一個全局的變量,但定義為一個〔使得在此函數中定義的變量,不僅僅受此函數把握〕。關于靜態變量static的一個小小的測試:#include<iostream>usingnamespacestd;intTest(inta){staticintb=5;b+=a;returnb;}intmain{inta=Test(10);cout<<a<<endl;intb=Test(20);cout<<b<<endl;return0;}1、C++編譯的程序占用的內存分類棧區〔stack〕:程序運行時由編譯器自動安排,存放函數的參數值,局部〔heap〕OS,安排方式倒是類似于鏈表。靜態區〔static〕:編譯器編譯時即安排內存。全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量 初始化的靜態變量在相鄰的另一塊區域。程序完畢后由系統釋放。文字常量區:常量字符串就是放在這里的。程序完畢后由系統釋放。程序代碼區:存放函數體〔類成員函數和全局函數〕的二進制代碼。2、內存安排方式有三種程序的整個運行期間都存在。例如全局變量,static在棧上創立:在執行函數時,函數內局部變量的存儲單元都可以在棧上創立指令集中,效率很高,但是安排的內存容量有限。freedelete存的生存期由我們打算,使用格外靈敏,但問題也最多。變量內存分布通過程序加以說明〔1〕變量分布ViewCode運行結果:ViewCode分析結果〔debug〕:變量在內存地址的分布為:棧-堆-代碼區-全局靜態-文字常量區棧中是由高到低的。全局變量和靜態變量假設不賦值,默認為0。棧中的變量假設不賦值,則是一個隨機的數據。,未初始化的全局變量和靜態變量安排在另一起。〔2〕函數分布ViewCode運行結果ViewCode結果分析:棧的伸展方向是由高地址向低地址擴展的量安排在另一起。程序變量分區中棧和堆的區分申請方式intb;系統自動bheap:Cmalloc,C++new運算符。p1=newchar[10];p2=newchar[20];p1、p2申請后系統的響應提示棧溢出。堆:首先應當知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序會在這塊內存空間中的首地址處記錄本次安排的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。由于找到的堆結點的大小不愿定正好等于申請的大小,系統會自動的將多余的那局部重放入空閑鏈表中。申請大小的限制Windows這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS2M〔1M,總之是一個編譯時就確定的常數〕,假設申請的空間超過棧的剩余空間時,將提示overflow較小。間比較靈敏,也比較大。申請效率的比較棧由系統自動安排,速度較快。但程序員是無法把握的。最便利。堆和棧中的存儲內容下一條可執行語句C當本次函數調用完畢后,局部變量先出棧,然后是參數,最終棧頂指針指向最開頭存的地址,也就是主函數中的下一條指令,程序由該點連續運行。chars1[]=“a“;char*s2=“b“;abint main{chara=1;charc[]=“1234567890“;char*p=“1234567890“;a=c[1];a=p[1];return0;}對應的匯編代碼10:a=c[1];004010678A4DF1movcl,byteptr[ebp-0Fh]0040106A884DFCmovbyteptr[ebp-4],cl11:a=p[1];0040106D8B55ECmovedx,dwordptr[ebp-14h]004010708A4201moval,byteptr[edx+1]004010738845FCmovbyteptr[ebp-4],alcledxedx小結堆和棧的主要區分由以下幾點:1、治理方式不同;2、空間大小不同;3、能否產生碎片不同;4、生長方向不同;5、安排方式不同;6、安排效率不同;memoryleak。324GVC61M從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,的可以參考數據構造。向;對于棧來講,它的生長方向是向下的,是向著內存地址減小的方向增長。編譯器進展釋放,無需我們手工實現。的效率比較高。堆則是C/C++函數庫供給的,它的機制是很簡潔的,例如為了安排一塊內存,庫函數會依據確定的算法〔具體的算法可以參考數據構造/操作系統〕〔可就有可能調用系統功能去增加程序數據段的內存空間,得多。EBP〔除非你是有意使其越界C++〔new/deletevsmalloc/free〕new/deletevsmalloc/freemallocfreeC++/C標準庫函數,new/deleteC++的運算符。malloc/free不在編譯器把握權限之內,不能夠把執行構造函數和析構函數的任務強加于。因此C++語言需要一個能完成動態內存安排和初始化工作的運算符newdeletenew/delete不是庫函數。new/deletemalloc/freeC++不把C++CCmalloc/freeC++內存治理之五〔數組vs〕以為兩者是等價的。但二者有著本質的區分:〕一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以轉變。針來操作動態內存。指針遠比數組靈敏,但也更危急。下面以字符串為例比較指針與數組的特性:修改內容1a6hello。aa[0]=‘X’p“world”〔位于靜態存儲區,內容為world〕,常量字符串的內容是不行以被修改的。從語法上看,編譯容而導致運行錯誤。1修改數組和指針內容chara[]=“hello”;a[0]=‘X’;cout<<a<<endl;char*p=“world”;//pp[0‘X’;//編譯器不能覺察該錯誤cout<<p<<endl;內容復制與比較2中,假設想把數組a的內容復制給b,不能用語句b=a,否則將產生編譯錯誤。應當用標準庫函數strcpy進展復制。同理,比較baif(b==a)來推斷,應當strcmpp,apamallocpstrcpyif(p==a)strcmp實例2數組和指針的內容復制與比較//chara[]=“hello“;charb[10];strcpy(b,a);//不能用b=a;if(strcmp(b,a)==0)//不能用if(b==a)?//intlen=strlen(a);char*p=(char*)malloc(sizeof(char)*(len+1));strcpy(p,a);//不要用p=a;if(strcmp(p,a)==0)//不要用if(p==a)?計算內存容量sizeof〔字節數〔asizeof(a)12〔留意別忘了’’〕。指針pa,但是sizeof(p4。這sizeof(char*),而申請內存時記住它。留意當數組作為函數的參數進展傳遞時,該數組自動退化7-3-3〔b〕中,不管數組asizeof(a)始sizeof(char*)。實例3(a)計算數組和指針的內存容量chara[]=“helloworld“;char*p=a;<<endl;//12cout<<sizeof(p)<<endl;//43(b)數組退化為指針voidFunc(chara[100]){cout<<sizeof(a)<<endl;//4100}指針參數是如何傳遞內存的?4(a)GetMemory(str,200)str,strNULL,為什么?實例4(a)試圖用指針參數申請動態內存voidGetMemory(char*p,intnum){p=(char*)malloc(sizeof(char)*num);}voidTest(void){char*str=NULL;GetMemory(str,100//strNULLstrcpy(str,“hello“);//運行錯誤}指針參數p的副本是_p,編譯器使_p=p。假設函數體內的程序修改了_p的p_ppGetMemoryGetMemory就free4(b)實例4(b)用指向指針的指針申請動態內存voidGetMemory2(char**p,intnum){*p=(char*)malloc(sizeof(char)*num);}voidTest2(void){char*str=NULL;//留意參數是&strstrstrcpy(str,“hello“);cout<<str<<endl;free(str);}4(c)實例4(c) 用函數返回值來傳遞動態內存char*GetMemory3(intnum){char*p=(char*)malloc(sizeof(char)*num); returnp;}voidTest3(void){char*str=NULL;str=GetMemory3(100);strcpy(str,“hello“);cout<<str<<endl;free(str);}用函數返回值來傳遞動態內存這種方法雖然好用,但是常常有人把return4(d)實例4(d)return語句返回指向“棧內存”的指針char*GetString(void){charp[]=“helloworld“; returnp;//編譯器將提出警告}voidTest4(void){char*str=NULL;str=GetString;//str的內容是垃圾cout<<str<<endl;}用調試器逐步跟蹤Test4strGetStringstrNULLworld”而是垃圾。4(d4(e),會怎么樣?4(e)returnchar*GetString2(void)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國豬養殖行業市場發展分析及發展前景與投資研究報告
- 2025-2030中國特色餐飲行業發展分析及競爭策略與趨勢預測研究報告
- 備考公共營養師必知試題及答案
- 現代藥物分析方法試題及答案
- 心理咨詢師2024年心理健康教育理念的理解試題及答案
- 2025-2030中國焊機行業市場深度調研及競爭格局與發展策略研究報告
- 2025年人力資源管理師模擬試題設計試題及答案
- 2025-2030中國熱電偶溫度變送器行業市場現狀分析及競爭格局與投資發展研究報告
- 2025-2030中國熱噴涂粉末行業市場現狀供需分析及投資評估規劃分析研究報告
- 八年級歷史上冊 第三單元 資產階級民主革命與中華民國的建立 第9課 辛亥革命教學設計 新人教版
- 2025年滁州市城投交通控股有限公司招聘19人筆試參考題庫附帶答案詳解
- 汽車美容師洗車方法實際操作試題及答案
- 鹽城2025年江蘇鹽城建湖縣部分醫療衛生事業單位校園招聘專業技術人員37人筆試歷年參考題庫附帶答案詳解
- 創新創業案例分析-大疆
- 2025年天津市濱城海洋文化旅游發展有限公司招聘筆試參考題庫附帶答案詳解
- 部門決算管理制度
- 第四代住宅白皮書-HZS
- 神經內科護理案例分析
- 50套普通話試題及答案
- 2025年安徽省中考模擬英語試題(原卷版+解析版)
- 幼兒園獲獎公開課:大班科學《色彩的擁抱》課件
評論
0/150
提交評論