C語言瘋狂講義 (十一)C語言動態記憶體及結構體

2021-06-27 02:37:33 字數 3372 閱讀 5950

1、動態記憶體管理

記憶體分為5大區域:

棧:存放區域性變數

堆:存放程式執行過程中,動態申請的空間

bss:未初始化的全部變數,和靜態變數

資料段:已經初始化的全域性變數和靜態變數常量

**段:程式源**編譯生成的二進位制檔案

1) malloc 

(void *)malloc(size)    //動態的向記憶體申請連續的size個位元組

返回的是新申請的記憶體空間的首位址

int *p = (int *)malloc(100);

//p是在棧區      malloc(100)在堆區

malloc不會把新申請的空間初始化

memset(p,0,100);  //全部初始化為0

2) calloc

calloc 可以向堆區連續申請多個少長度為指定長度的空間

int *p = (int *)calloc(5,4);  //申請5個長度為4的空間

calloc可以把新申請的空間初始化0

注意:判斷乙個空間是否申請成功

if(p!=null)

3) realloc 

重新改變一塊記憶體空間的大小

p = (int *)realloc(p,size);

4) free

釋放我們指定的記憶體空間

free(p);    //p是我們新申請的記憶體單元

如果不釋放,造成記憶體的洩露

2、指標和函式之間的關係

1)返回值值是指標的函式指標函式

char * getday()

int * getaddr(int *a,int *b)

2)函式指標

指向函式的指標

格式:返回值(*指標變數名)(函式的引數);

int sum(int a,int b)

//定義乙個函式指標p1,p1只能指向返回值是int型別,並且函式引數有兩個,而且整形

int (*p1)(int a,int b);

int (*p2)(int,int);

技巧:

宣告的格式:int sum(int a,int b);

int (*p3)(int a,int b);

4、結構體基本概念

構造型別:由乙個或者多個相同型別或者不同型別已經定義的變數用構造的方法,構造乙個新的型別;

陣列結構體

共用體

結構體定義:

struct 結構體名 ;

使用構造型別的步驟:

定義構造型別--  定義構造型別的變數--> 結構體變數初始化

--》使用結構體的變數

5、結構體的變數定義

1)定義結構的同時,定義變數

struct carcar1,car2;    //定義了兩個結構體變數,car1和car2都是 car型別

2)先定義結構體,後定義變數

struct student;

struct student  stu1,stu2;  //stu1和stu2都是student型別的

3)匿名結構體定義變數

struct iphone5,iphone6;

6、結構體變數的初始化

初始化結構體變數應注意:初始化的值得型別和順序要一致。

1)定義結構的同時,定義變數,然後初始化

struct carcar1=,car2=;    //定義了兩個結構體變數,car1和car2都是 car型別

2)先定義結構體,後定義變數,然後初始化

struct student;

struct student  stu1=,stu2=;  //stu1和stu2都是student型別的

3)匿名結構體定義變數,然後初始化

struct iphone5=,iphone6=;

4)指定初始化的屬性

struct carc1=;

struct car c2;

= "bmw";  x

7、結構體變數成員的訪問方法

格式:結構體的變數名.成員變數名

c1.lunzi

c1.pp

8、結構的記憶體儲存細節

結構體內存占用?

每個元素占用之和(還要考慮對齊的問題)

對齊?

為了提高讀取效率,計算機每次讀取乙個數的倍數(防止乙個數讀取兩次)

對齊的模數

乙個結構體中,占用的位元組數最大的那個數,就是對齊的模數

計算儲存的時候,按照模數儲存和分配儲存空間

計算長度:sizeof(struct 結構名)

從結構體的第乙個成員開始,每次分配模數大小的空間,要考慮空閒的空間的再利用

9、結構體的作用域

全域性的結構體:從定義的位置開始到檔案的末尾

區域性的結構體:在函式的內部或者**塊內部定義的結構體

從定義的位置開始

到所在的**塊 「}」 結束

結構體的作用域的使用,同區域性變數和全域性變數使用一樣

10、結構體的陣列

由相同型別的結構體變數組成的有序的集合。

定義格式:

1) 定義結構體的同時定義結構體陣列

struct carcars[5];

2) 使用匿名結構體定義陣列

struct cars[5];

3)先定義結構體在定義變數

struct car cars[5];

初始化:

1) 定義結構體陣列的同時進行初始化1

struct carcars[2]=,};

2)struct cars[2]=,};3)

struct car cars[2]=,};

4)先定義陣列,後初始化

cars[0].lunzi = 4;

cars[0].speed = 200;

//cars[0].name="***x"; 錯誤的

strcpy(cars[0].name,"***x");

const char a;

//用乙個整體去初始哈哈

cars[1]=(struct car);

11、結構體指標

定義乙個指標指向結構體變數

格式:結構體型別  * 結構體的變數名;

struct student stu1;

struct studetn *pstu;

pstu = &stu1;

目的:間接訪問結構體變數中儲存的成員變數值

(*pstu).name   (*pstu).sno 

新的訪問方法

pstu->name   等價於 (*pstu).name

12、結構體與函式之間的關係

1)結構體變數的成員變數做函式引數(除了陣列之外,都是值傳遞)

2)結構體變數作為函式的引數(值傳遞)

3)結構體指標作為函式的引數(位址傳遞)

C語言瘋狂講義 (四)C語言分支語句

1 程式的結構 程式預設從上到下順序執行 順序結構 程式的結構 順序結構 分支結構 迴圈結構 2 if分支語句 程式執行的過程中可以有多個選擇 格式 if 表示式 進行表示式的求值 如果表示式的值為非0 真 會執行語句塊 0 假 不會執行語句塊,3 if分支語句的幾種形式 1 最簡單的,要不執行,要...

C語言瘋狂講義 (五)C語言迴圈語句

1 迴圈控制 迴圈是程式語句的一種結構,當條件滿足的時候,一直重複執行某一段 當條件不滿足的時候,需要退出迴圈 正常情況下,夠成迴圈結構三個要素 1 迴圈結束的條件 2 得有迴圈體 3 有乙個操作可以讓迴圈條件為假 2 while迴圈 當型迴圈 當 滿足時候,然後.格式 while 表示式 計算機首...

C語言瘋狂講義 (七)C語言進製轉換

1 計算機中的進製 2進製 逢二進1 0 1 8進製 逢八進1 0 1 2 3 4 5 6 7 10進製 逢十進1 預設的進製 0 9 16進製制 逢十六進1 0 9 a b c d e f 記憶體的位址格式 2 進製的轉換問題 三個要素 數字 0 7 基數 每一位能取值的個數 位權 數碼 基數 數...