typedef,結構體,共用體,聯合體
typedef的用途:
-
封裝資料型別,方便移植
-
簡化函式指標的定義
結構體:不同類的型元素匯聚。
(1)、在宣告型別的同時定義變數:
struct結構體名{
成員列表
}變數名列表;
(2)、直接定義結構體型別變數
struct
{
成員列表
}變數名錶列;
指向結構體變數的指標
定義形式:struct結構體名 *結構體指標名;
例如:struct student *p;
#define_CRT_SECURE_NO_WARNINGS//去掉安全檢查
#include<stdio.h>
#include<stdlib.h>
struct
{
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 = &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案例
列舉變數:
動態記憶體申請:-
在記憶體中申請的。
malloc()返回的型別是:void *型別的
2、malloc之後要記著釋放,使用free函式。否則會造成記憶體洩露,導致其它程式不能再使用這塊兒記憶體了。
作業系統在管理malloc的時候是一下這種方式:
//|地址|
//|大小|
呼叫malloc的時候,系統每次都會為malloc建立一個節點,並記錄本次malloc的首地址和malloc的大小。
malloc記憶體裡面申請出來的值是什麼值?
在gcc這個編譯器下,malloc預設把申請的記憶體中的初始值變成0,但是在不同的編譯器下回有所不同。
如果想將malloc中申請的記憶體的值變成0,可以使用memset(p,0x0,100);如果想使用這個函式,要加上標頭檔案<string.h>
calloc()
realloc:當記憶體不夠了時候,可以通過realloc繼續申請記憶體空間。
realloc的實現策略:
-
當malloc後面有足夠的儲存空間。這時候相當於把malloc的首地址不變,只是把malloc的大小改大些。
-
如果malloc後面的儲存空間不夠,那麼這時候realloc新開闢一個地址空間,然後將原來malloc的記憶體裡的記憶體複製到新開闢的記憶體空間中。