C 深入(記憶體模型)

2022-05-21 09:01:12 字數 3204 閱讀 4973

為什麼有資料型別?

現實生活中的資料太多而且大小形態不一。

資料型別與記憶體的關係:

資料型別的本質:建立變數的模具,是固定大小的別名。

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

int main()

問題:b,&b所代表的資料型別不一樣:

b代表的是陣列首元素的位址,&b代表的是整個陣列的位址。&b+1,相當於給整個陣列加了1個陣列大小的位址。

重點:(陣列資料型別:1.定義;2.陣列指標;3.陣列型別和陣列指標型別的關係)

陣列的大小:

printf("sizeof(b):%d",sizeof(b));//40

printf("sizeof(a):%d",sizeof(a));//4

資料型別的作用:編譯器預算物件分配的記憶體空間大小。

資料型別的別名:typedef

struct teacher

main:

struct teacher t1;//沒有struct關鍵字會報錯

t1.age = 3;

自定義資料型別:typedef

typedef struct teacherteacher;

main:

struct teacher t1;//沒有struct關鍵字不會報錯

t1.age = 31;

c語言中會報錯,c++中增強了struct關鍵字。會沒有問題。

1.void"無型別",void*"無型別指標",可以指向任何型別的資料。

2.用法:

1.資料型別的封裝

int inithardenv(void **handle);

典型的如記憶體操作函式memcpy和memset的函式原型分別為   void * memcpy(void *dest, const void *src, size_t len);

void * memset ( void * buffer, int c, size_t num );

2.void修飾函式返回值和引數,僅表示無。

如果函式沒有返回值,那麼應該將其宣告為void型

如果函式沒有引數,應該宣告其引數為void

int function(void)

3.void指標的含義:

c語言規定只有相同型別的指標才可以相互賦值

void指標作為左值用於「接收」任意型別的指標

void指標作為右值賦值給其它指標時需要強制型別轉換

int *p1 = null;

char *p2 = (char *)malloc(sizoeof(char)*20);

變數概念:即能讀又能寫的記憶體物件,若一旦初始化不能修改的物件是常量。

變數的本質:

1.程式通過變數名來申請和命名空間

2.通過變數名訪問記憶體空間(一段連續)記憶體空間的別名(猶如門牌號)

3.修改變數的方法:

1.直接(賦值法)eg:int a = 78;

2.間接。記憶體有位址編號,通過位址編號可以修改記憶體;

int a;

int b;

int *p;

a = 10;//直接修改

printf("&a:%d\n",&a);//獲取到a的位址1245024

//間接修改====直接通過記憶體修改

*((int*)1245024) = 200;//int* 表示型別,*()代表作指標

printf("a:%d\n",a);//200

printf("a:%d\n",a);//300

4.對記憶體空間能取別名.....

5.資料型別和變數的關係:通過資料型別定義變數

總結:

1.對記憶體,可讀可寫;

2.通過變數往記憶體讀寫資料;

3.不是向變數讀寫資料,而是向變數所代表的記憶體空間中寫資料。(變數跑哪去了?變數有變數的儲存空間);

思考1:變數三要素(名稱、大小、作用域),變數的生命週期?

思考2:c++編譯器是如何管理函式1,函式2變數之間的關係的?

記憶體四區的流程:

硬碟(程式)>>記憶體(**,作業系統**)

=>>執行過程中,c程式記憶體管理(堆區,棧區,全域性區,**區)

流程說明:

1.作業系統把物理硬碟**load到記憶體

2.作業系統把c**分成四個區

3.作業系統找到main函式入口執行

各區元素分析:

1.棧區(stack):由編譯系統自動分配釋放,存放函式的引數值,區域性變數的值等。

2.堆區(heap):一般由程式設計師分配釋放(動態記憶體申請與釋放)如程式設計師不釋放,程式結束時可能作業系統**。

3.全域性區(靜態區)(static):如果儲存的值一樣,c++編譯器會自動保留乙份。

1.全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,該區域在程式結束後有作業系統釋放。

2.常量區:字串常量和其他常量的儲存位置,程式結束後有作業系統釋放。

4.程式**區:存放函式的二進位制**。

C語言的深入 記憶體對齊的概念

1 記憶體對齊的概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。2 記憶體對齊的意義 需要記憶體對齊的根本原因在於cpu訪問資料的效率問題。從某種意義上講...

深入記憶體模型和函式呼叫機制,理解析構函式的執行順序

為什麼析構函式的執行順序是相反的。要搞清楚這個問題,首先要明白c 記憶體模型,也就是c 的 和資料在記憶體中是如何儲存的。c 記憶體模型和c語言類似 有部分細節不同 你可以參照c語言記憶體模型來理解。在記憶體模型中有一塊區域叫做棧區,它是由系統維護的 程式設計師無法操作 用來儲存函式的引數 區域性變...

更新的深入內容

有三個操作可改變表的狀態 插入乙個新行 刪除乙個現有的行 更新乙個現有的行 對於其中的每乙個關鍵操作,資料介面卡都會定義乙個作為屬性公開的自定義的命令物件。這樣的屬性包括insertcommand deletecommand和updatecommand。程式設計師負責為這些屬性分配有意義的命令物件,...