定義在函式內部的變數
作用域:從定義位置開始到包裹該變數的第乙個右大括號結束
定義在全域性變數位置
定義語法:在區域性變數定義之前新增static關鍵字
特性:靜態區域性變數只定義一次,在全域性位置,通常用來做計數器
作用域:從定義位置開始到包裹該變數的第乙個右大括號結束
就是常說的函式
定義語法:函式原型 + 函式體
**段:.text段。這裡存放的是程式的源**(二進位制形式)
資料段:分為唯讀資料段.rodata、初始化資料段.data、未初始化資料段.bss
stack棧:在其之上開闢棧幀,windows系統中預設大小為1m,可以提公升到10m,linux裡面預設是8m,可以提公升到16m
heap堆:給使用者自定義資料提供空間的,空間約是1.3g+
裡面存放的是初始化為非0的全域性變數和靜態變數
裡面存放的是初始化為0、未初始化的全域性變數和靜態變數。程式載入執行前,會將該段整體賦值為0
裡面存的是常量
容量比較小,由系統自動管理,自動分配,自動釋放
儲存特性是:filo後進先出
空間足夠大,可大可小的內容都放到堆裡面去,因為heap可以認為是無限的空間
是乙個正方形(由於windows系統閉源,所以該模型僅僅是推測),化成了四塊
是乙個長方形,橫向劃分,從下至上是:
.text(唯讀) — .rodata (唯讀)— .data(讀寫) ---- .bss(讀寫) — heap – 標準庫載入的位置–(挨近3g的地方)stack
區域性變數:從變數定義開始,到函式呼叫完成,即函式內部。 --函式內部
全域性變數:從程式啟動開始(早於main函式),到程式終止結束。 --程式執行期間
static區域性變數:程式啟動開始,到程式終止結束。 --程式執行期間
static全域性變數: 程式啟動開始,到程式終止結束。 --程式執行期間
全域性函式:程式啟動開始,到程式終止結束。 --程式執行期間
static函式:程式啟動開始,到程式終止結束。 --程式執行期間
在堆上面用空間的話要先申請,這就要開闢空間,有開闢就有釋放
void *malloc(size_t size) //申請size大小的空間,返回實際申請到的記憶體空間首位址。我們通常拿來當陣列用
void free(void *ptr)
使用heap空間當陣列用時,必須要求空間是連續的
free後的空間不會立即失效,通常將free後的位址要置為空
free的位址必須是malloc申請的位址。否則會報錯。
malloc和free應該成對出現,如果分配的位址必須要變化的話,那就先用乙個tmp來存這個位址,後面去釋放這個tmp
#define _crt_secure_no_warnings
#include
#include
#include
#include
#include
intmain
(void
)//寫資料到malloc空間
for(size_t i =
0; i <
10; i++
)//讀出malloc中的資料
for(size_t i =
0; i <
10; i++
)//不用的話要釋放記憶體
free
(p);
p =null
system
("pause");
return exit_success;
}
申請外層指標:char **p =(char **) malloc(sizeof(char * ) * 5); //強轉成什麼型別都是跟著前面走的
申請內層指標:for(i = 0;i<5;i++)
使用:for(i = 0;i<5;i++)
釋放:先內後外
for(i = 0;i<5;i++)
釋放外層:free§;
這三個函式都是變參函式,即形參中有「…」,最後乙個固定引數通常是格式描述串(包含格式匹配符),函式的引數個數、型別、順序都是由這個固參決定
printf(「hello」)
char buf[1024];
sprintf(buf,「hello」);
file *fp = fopen();
fprintf(檔案指標,格式串)
fprintf(fp,「hello」)
scanf("%d",&m) --從鍵盤接收資料
char str = 「98」
sscanf(str,"%d",&m) --從字串str中接收資料
file *fp = fopen(「abc.c」)
fscanf(fp,"%d",&m) –
#define _crt_secure_no_warnings
#include
#include
#include
#include
#include
intwrite_file()
fprintf
(fp,
"%d%c%d = %d\n",10
,'*',5
,10*5
);fclose
(fp);}
intread_file()
fscanf
(fp,
"%d%c%d = %d\n"
,&a,
&ch,
&b,&c )
;printf
("%d%c%d = %d\n"
, a, ch, b, c)
;fclose
(fp);}
intmain
(void
)
這三組函式都是用來處理文字檔案的
這兩個是用來處理二進位制檔案的
fwrite:寫出資料到檔案中,它有四個引數
參1:待寫出資料的位址
參2:待寫出資料的大小
參3:寫出的個數/次數 --參2 * 參3 =寫出資料的總大小
參4:檔案
返回值:成功:永遠時參3的值;
失敗:返回0
使用技巧:通常將參2傳1,將參3傳實際寫出的位元組數
int ret =
fwrite
(&stu[0]
,1,sizeof
(stu_t)
, fp)
;int ret =
fwrite
(&stu[0]
,1,sizeof
(stu_t)*4
, fp)
;//這是返回四個結構體
typedef
struct student stu_t;
intmain
(void);
file *fp =
fopen
("test03.txt"
,"w");
//開啟檔案if(
!fp)
int ret =
fwrite
(&stu[0]
,1,sizeof
(stu_t)
, fp)
;//返回的是參3的值
if(ret ==0)
printf
("%d\n"
, ret)
;fclose
(fp)
;system
("pause");
return exit_success;
}
fread()函式:從檔案fp中讀出
參1:讀取到的資料儲存的位置
參2:一次讀取的位元組數
參3:讀取的次數 --參2 * 參3 = 讀出的資料總大小
參4:從哪個檔案中讀
返回值:成功的話返回參3的值,通常將參2傳參1,將參3傳要讀出的位元組數
失敗返回0;0同時也能表示讀到檔案結尾
0:讀失敗----feof(fp)
c day 13智慧型指標, 巨集變數,列舉
unique ptr unique ptr是唯一指標,如果有這個指標進行包裝其他的指標,當這個指標變數拷貝的時候會出現錯誤,這是因為這個指標是唯一的,不允許被複製 int main p1 會出現錯誤 shared ptr shared ptr是共享指標,它允許多個指標指向同乙個記憶體,可以被複製,每...
c day13 多型 虛析構 過載重寫重析構
如果不寫virtual關鍵字會是靜態鏈結編譯 includeusing namespace std class a protected private class b protected private class c public a protected private 封裝,封裝突破c函式的概念...
記憶體管理策略!(13)
對於32位程序而言,這個位址空間的大小為4gb。而64位程序則可以到達16eb的位址空間。每個程序都有自己專有的位址空間,當程序中的執行緒執行時,他們只能訪問屬於該程序的記憶體。每個程序的虛擬空間都被劃分成許多分割槽 0x00000000 0x0000ffff是空指標賦值分割槽 0x00010000...