C 自學筆記

2021-10-08 18:28:29 字數 2304 閱讀 2386

本次記錄程式的記憶體分割槽模型,還請各位大佬批評指正!

c++程式在執行時,將記憶體大方向劃分為4個區域:

1、**區:存放函式體的二進位制**,有作業系統進行管理(寫的所有**放在該區域)

2、全域性區:存放全域性變數和靜態變數以及常量

3、棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數

4、堆區:由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統**

記憶體四區的意義:不同區域存放的資料,賦予不同的生命週期,給我們更大的靈活程式設計。

一、程式執行前

在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域

1、**區

存放cpu執行的機器指令。

**區是共享的,目的是對於頻繁被執行的程式,只需要在記憶體中有乙份**即可。

**區是唯讀的,使其唯讀的原因是防止程式意外修改了它的指令。

2、全域性區

全域性變數、靜態變數和常量存放在此。

全域性區還包含了常量區,字串常量和其他常量(const修飾的變數)也存放在此。

該區域的資料在程式結束後由作業系統釋放。

(1)不在全域性區中:

區域性變數;

const修飾的區域性變數(區域性常量)。

(2)在全域性區中:

全域性變數;

靜態變數(static);

常量(字串常量、const修飾的全域性變數(全域性常量))。

總結:

(1)c++在程式執行前分為全域性區和**區;

(2)**區的特點是共享和唯讀;

(3)全域性區存放全域性變數、靜態變數和常量;

(4)常量區中存放const修飾的全域性變數(全域性常量)和字串常量。

二、程式執行後

3、棧區:

由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統**。

在c++中主要利用new在堆區開闢記憶體。

總結:堆區資料由程式設計師管理開闢和釋放。

堆區資料利用new關鍵字進行開闢記憶體。

三、new操作符

c++中主要利用new操作符在堆區開闢資料。

堆區開闢的資料,由程式設計師手動開闢,手動釋放,釋放利用操作符delete。

利用new建立的資料,會返回該資料對應的型別的指標。

1、區域性變數a、b和const修飾的區域性變數(區域性常量)c_l_a、c_l_b的位址相近,都不在全域性區中。

2、而全域性變數g_a、g_b,靜態變數s_a、s_b,字串常量和全域性常量c_g_a、c_g_b的位址相近都位於全域性區中。

#include#include #includeusing namespace std;

//全域性變數

int g_a = 10;

int g_b = 10;

//const修飾的全域性變數,全域性常量

const int c_g_a = 10;

const int c_g_b = 10;

int main()

#include#include #includeusing namespace std;

//棧區資料注意事項 --- 不要返回區域性變數的位址

//棧區資料由編譯器管理、開闢和釋放

int * func1(int b) //形引數據也會放在棧區

int main()

利用new關鍵字可以將資料開闢到堆區!

#include#include #includeusing namespace std;

//堆區

int* func2() //

int main()

利用new關鍵字可以將資料開闢到堆區,如果想釋放,利用關鍵字delete!

new返回的是該資料型別的指標!

#include#include #includeusing namespace std;

//new的基本語法

int * func3() //

void test01()

//在堆區利用new開闢陣列

void test02()

for (int i = 0; i < 10; i++)

//釋放堆區陣列 要加中括號才可以

delete arr;

}int main()

C 自學筆記

本次記錄結構體,還請各位大佬批評指正!結構體屬於使用者自定義的資料型別,允許使用者儲存不同的資料型別 整型 浮點型 字元型 布林型 即不同資料型別的集合所組成的乙個型別。建立學生資料型別,然後通過學生資料型別建立具體的學生。通過結構體建立變數的方式有三種 1 struct 結構體名 變數名 2 st...

C 自學筆記

本次記錄函式提高,還請各位大佬批評指正!在c 中,函式的形參列表中的形參是可以有預設值的。語法 返回值型別 函式名 引數 預設值 注意事項 1 如果某個位置有預設引數,那麼從這個位置之後,從左往右都必須有預設值。2 如果函式的宣告有預設引數,那麼函式的實現就不能有預設引數。宣告和實現只能有乙個有預設...

C 自學筆記

筆記整理自 菜鳥c 教程 物件導向,區分大小寫 寫法 include 或include stdio.h iostream.h iostream的區別 static 區域性變數,檔案內全域性變數 extern 所有檔案可見變數 thread local 執行緒內變數 值 i j,實參i,形參j,i賦值...