目錄
- 一、記憶體
- 1.1 記憶體四區
- 1.2 new運算子
- 二、參考
- 2.1 參考基本使用和注意事項
- 2.2 參考做函式引數
一、記憶體
1.1 記憶體四區
C++程式在執行時,將記憶體大致分為4個區域:代碼區,全域區,堆疊區,堆區
- 代碼區:存放函式體的的二進制代碼,作業系統管理,
🔵特點:①共享 :對于頻繁被執行的程式,只需要在記憶體中有一份代碼即可,
②只讀:目的是防止程式意外地修改了它的指令,
- 全域區:存放全域變數、靜態變數和常量(除了const修飾的區域變數),程式結束時由作業系統釋放,
//全域變數
int g_a = 10;
const int c_g_a = 10;
int main()
{
int l_a = 10;
//靜態變數
static int s_a = 10;
//常量:字串常量/const修飾的變數(全域/區域變數)
const char* a = "hello";
const int c_l_a = 10;
cout << "區域變數l_a的十進制地址為:" << (int)&l_a << endl;
cout << "全域變數g_a的十進制地址為:" << (int)&g_a << endl;
cout << "靜態變數s_a的十進制地址為:" << (int)&s_a << endl;
cout << "字串常量a的十進制地址為:" << (int)a << endl;
cout << "const修飾的全域變數c_g_a的十進制地址為:" << (int)&c_g_a << endl;
cout << "const修飾的區域變數c_l_a的十進制地址為:" << (int)&c_l_a << endl;
return 0;
}

- 堆疊區:存放函式的引數值、區域變數,由編譯器自動分配和釋放,
🔴注意:不要回傳區域變數的地址,
int* funcation()
{
int a = 10;//存放在堆疊區,堆疊區的資料在函式執行完后自動釋放
return &a;
}
int main()
{
int* p = funcation();
cout <<"區域變數a的值為:"<< *p << endl; //第一次正常列印,因為編譯器做了保留
cout << "區域變數a的值為:" << *p << endl;
return 0;
}

- 堆區:由程式員分配(
new)和釋放(delete),若程式員不釋放,程式結束時由作業系統回收,
int* funcation()
{
//new關鍵字,可以將資料開辟到堆區上
//指標本質上也是區域變數,存放在堆疊區上,但是保存的資料在堆區
int* p = new int(10);
return p;
}
int main()
{
int* p = funcation();
cout << *p << endl;
cout << *p << endl;
return 0;
}

Tip:
- 程式運行前分為:代碼區,全域區
- 程式運行后分為:堆疊區,堆區
[注]: 關于記憶體更詳細的知識👉深度剖析資料在記憶體中的存盤👉幾分鐘讓你了解什么是函式堆疊幀的創建和銷毀
1.2 new運算子
//new的基本用法
int* p = new int(10);//在堆區創建整型變數,回傳該變數的地址
delete p;//釋放
int* parr = new int[10];//在堆區創建一個元素為10的整型陣列,回傳陣列首元素的地址
delete[] arr;//釋放一個陣列
測驗delete
int* funcation()
{
int* p = new int(10);
return p;
}
int main()
{
int* p = funcation();
cout << *p << endl;
cout << *p << endl;
delete p;
cout << *p << endl;
return 0;
}
二、參考
2.1 參考基本使用和注意事項
作用:給變數起個別名,
語法:資料型別 & 別名=原名
//eg.
int a = 10;
int& b = a;
注意:
①參考必須初始化,
②參考一旦初始化就不可以更改了,
//①參考必須初始化
int a = 10;
int& b;//錯了!!!
//②參考一旦初始化就不可以更改了
int a = 10;
int c = 20;
int& b = a;
int& b = c; //錯了!!!
2.2 參考做函式引數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302452.html
標籤:其他
