1. 程式人生 > >typedef,結構體,共用體,聯合體

typedef,結構體,共用體,聯合體

typedef的用途:

  1. 封裝資料型別,方便移植

  2. 簡化函式指標的定義

結構體:不同類的型元素匯聚。

1)、在宣告型別的同時定義變數:

struct結構體名{

成員列表

}變數名列表;

2)、直接定義結構體型別變數

struct

{

成員列表

}變數名錶列;

指向結構體變數的指標

定義形式:struct結構體名 *結構體指標名;

例如:struct student *p;

#define_CRT_SECURE_NO_WARNINGS//去掉安全檢查

#include<stdio.h>

#include<stdlib.h>

struct

mydata

{

intnum;

charstr[100];

};

voidmain()

{

//int a;

//int *p;

//struct mydata *p;

//printf("%d", sizeof(p));

structmydatamd;//例項化結構體

md.num = 99;

sprintf(md.str,"gogogo");

printf("md.num=%d,md.str=%s",md.num,md.str);//列印資料

structmydata *p;//p儲存地址 struct mydata決定了大小還有如何解析

printf("\n%d",sizeof

(p));

p = &md;//結構體指標初始化,儲存地址

printf("\n(*p).num=%d,(*p).str = %s", (*p).num, (*p).str);

printf("\np->num = %d,p->str=%s",p->num,p->str);

//指標訪問結構體,第一種方式(*p.成員變數,第二種p->成員變數

getchar();

}

 

結構體變數:

簡單案例:

結構體成員地址從低到高連續分配,首成員對應低地址。

公用/聯合體(union:使用不同型別的變數共佔用一段記憶體(相互覆蓋),次共用體大小為元素中最大位元組變數。

共用體成員索引:可以通過.成員變數符,也可以通過à指標索引。

     

union案例

 

列舉變數:

動態記憶體申請:
  1. 在記憶體中申請的。

    malloc()返回的型別是:void *型別的

      2malloc之後要記著釋放,使用free函式。否則會造成記憶體洩露,導致其它程式不能再使用這塊兒記憶體了。

作業系統在管理malloc的時候是一下這種方式:

//|地址|

//|大小|

呼叫malloc的時候,系統每次都會為malloc建立一個節點,並記錄本次malloc的首地址和malloc的大小。

malloc記憶體裡面申請出來的值是什麼值?

gcc這個編譯器下,malloc預設把申請的記憶體中的初始值變成0,但是在不同的編譯器下回有所不同。

如果想將malloc中申請的記憶體的值變成0,可以使用memset(p,0x0,100);如果想使用這個函式,要加上標頭檔案<string.h>

calloc()

realloc:當記憶體不夠了時候,可以通過realloc繼續申請記憶體空間。

realloc的實現策略:

  1. malloc後面有足夠的儲存空間。這時候相當於把malloc的首地址不變,只是把malloc的大小改大些。

  2. 如果malloc後面的儲存空間不夠,那麼這時候realloc新開闢一個地址空間,然後將原來malloc的記憶體裡的記憶體複製到新開闢的記憶體空間中。