<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從本文開始我就要日常更新C++入門博文啦,從核心程式設計開始,之前的一些基礎我就不再從零整理了,只有函數傳參、結構體、指標、陣列等稍微難理解的知識在之前的博文寫的比較全面;因為競爭確實很大,其他人總結的也很好,要看更詳細的基礎就看本站的技能樹,非常全面;我寫部落格的初衷一是可以記錄自己的學習,加以鞏固;二是給更多的人更容易的講解來快速入門C++,C/C++永不過時!!!
下文有記憶體四區的詳細介紹及作用
記憶體四區的意義:不同區域存放的資料賦予不同的生命週期,讓我們的程式設計方式更靈活。
在程式編譯後,生成了可執行程式.exe,未執行程式前分為兩個區域為程式碼區和全域性區
作用:
存放CPU執行的機器指令(二進位制程式碼,由作業系統進行管理)
程式碼區是共用的,共用的目的是對於頻繁被執行的程式,只需要再記憶體中有一份程式碼即可
程式碼區是唯讀的,使其唯讀的原因是防止程式意外地修改了它的指令
全域性變數和靜態常數存放在此
全域性區還包含了常數區,字串常數和其他常數也存放在此
該區域的資料在程式結束後由作業系統釋放
程式碼範例:
#include<iostream> using namespace std; //全域性變數 int g_a = 10; int g_b = 10; const int c_g_a=10; const int c_g_b=10; int main() { //建立普通區域性變數 int a = 10; int b = 10; cout << "區域性變數a的地址為:" << (int)& a << endl; cout << "區域性變數b的地址為:" << (int)& b << endl; int c_l_a = 10; int c_l_b = 10; cout << "區域性常數c_l_a的地址為:" << (int)&c_l_a << endl; cout << "區域性變數c_l_b的地址為:" << (int)&c_l_b << endl; cout << "全域性變數g_a的地址為:" << (int)&g_a << endl; cout << "全域性變數g_b的地址為:" << (int)&g_b << endl; //靜態變數 static int s_a = 10; static int s_b = 10; cout << "靜態變數s_a的地址為:" << (int)&s_a << endl; cout << "靜態變數s_b的地址為:" << (int)&s_b << endl; //字串常數 cout << "字串常數的地址為:" << (int)&"Hello World" << endl; //const 修飾的變數 //const 修飾的全域性變數、const修飾的區域性變數 cout << "全域性常數c_g_a的地址為:" << (int)&c_g_a << endl; cout << "全域性常數c_g_b的地址為:" << (int)&c_g_b << endl; }
各變數地址的關係:
從執行效果可以清楚的看到帶全域性的變數地址所佔空間相近,而區域性的地址相差就比較遠了,看下我做的圖示總結:
由編譯器自動分配釋放,存放函數的引數值,區域性變數等
注意事項:不要返回區域性變數的地址,棧區開闢的資料由編譯器自動釋放
#include<iostream> using namespace std; int* func1(int b)//返回值型別為 int *,所以return一個地址才合法 {//形引資料也會開闢到棧區 b = 100; int a = 10;//區域性變數,存放在棧區,棧區的資料在函數執行完成後自動釋放 return &a;//返回區域性變數的地址 } int main() { //接受func1函數的返回值 int* p = func1(10); cout << *p << endl;//第一次資料正常,因為編譯器會自動保留 cout << *p << endl;//第二次往後是亂數,該地址被釋放 cout << *p << endl; }
tips:這裡輸出只有一個10,剩下輸出結果無法猜測,因為返回的地址已經被編譯器釋放掉
由程式設計師分配釋放,若程式設計師不釋放,程式結束時由作業系統回收
在C++中主要利用new在棧區開闢記憶體
範例:
int * func() { //利用new 關鍵字把棧開闢到堆區 //指標 *p實質上也是棧區資料,指標儲存的資料放到堆區 int* p = new int (10); return p; } int main() { int* a = func(); cout << *a << endl;//無論輸出多少次,都能輸出a的值 cout << *a << endl; cout << *a << endl; }
這裡不同於棧區的時,無論輸出多少次*a,都是結果十,下面來張圖助理解:
主函數中用*a作為*p的返回值,a的地址為0x0011,儲存的資料為10,這是資料儲存在堆中,除非程式結束,該地址都不會被釋放。
開闢:
資料型別 + 指標變數 = new +相同資料型別 +(賦值)
這樣可在堆區開闢資料,作為棧區函數返回值也不會被編譯器自動釋放
刪除:
delete 變數地址
堆區資料由管理員開闢或釋放,如果想要釋放資料就利用delete關鍵字
範例:int* Array = new int[n];
和基本語法相比就是()變成了[],並且裡面可以存放常數或者變數,當我們想控制陣列長度的時候,這也是自定義的一種方法。讓 n 等於10,那麼陣列Array[]的長度為十,我們可以用亂數來給陣列賦值。釋放陣列也是利用delete關鍵字,例如 delete[] Array;
刪除陣列加[]放在陣列名前。
例如:
void test02(int *Array) { srand((unsigned int)time(NULL)); for (int i = 0; i < 10; i++) { Array[i] = rand() % 20 + 1; } for (int i = 0; i < 10; i++) { cout << Array[i] << " "; } } int main() { int *Array = new int [10]; test02(Array); }
附帶個執行圖:
到此這篇關於C++深入淺出講解記憶體四區與new關鍵字的使用的文章就介紹到這了,更多相關C++記憶體四區內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45