作用域:作用的範圍
a.普通區域性變數
#include
intmain
(int argc,
char
*ar**)
內部定義的變數就是區域性變數
//只有執行到定義變數的這個語句,系統才會給這個變數分配空間
//當離開{},這個非static區域性自動釋放
//區域性變數的作用域在當前的{},離開此{},無法使用此變數
//{}的普通區域性變數,加不加auto關鍵字等價,普通區域性變數也加自動變數
//不同的{}中,變數名字可以一樣
//普通區域性變數不初始化,它的數為隨機數
int tmp=11;
}
a=11;
//err因為a只有在上面的{}內有效
}
b.static區域性變數#include
//在{}內部定義的變數就是區域性變數
//static區域性變數,實在編譯階段就已經分配空間,函式沒有調研前,它就已經存在
//當離開{},static區域性變數不會釋放,只有程式結束,static變數才會自動釋放
//區域性變數的作用域在當前的{},離開此{},無法使用此變數
//{}的普通區域性變數,加不加auto關鍵字等價,普通區域性變數也加自動變數
//不同的{}中,變數名字可以一樣
//如果static區域性變數不初始化,
//如果static區域性變數不初始化,它的值預設為0
//static區域性變數初始化語句,只會執行一次,但是可以賦值多次
//static變數只能用常量初始化
void
fun(
)void
static_fun()
intmain
(int argc,
char
*ar**)
c.普通區域性變數和static區域性變數的區別
記憶體分配和釋放
普通區域性變數只有執行到定義變數的語句才分配空間
static區域性變數在編譯階段(函式還沒有執行),變數的空間已經分配
static區域性變數只有在整個程式結束才自動釋放
初始化
普通區域性變數不初始化,值為隨機數
static區域性變數不初始化,值為0
static區域性變數初始化語句只有第一次執行時有效
static區域性變數只能用常量初始化
d.普通全域性變數
#include
//在{}外面(函式外面)定義的變數為全域性變數
//只有定義了全域性變數。任何地方都能使用此變數
//如果使用變數時,在前面找不到此全域性變數的定義,需要宣告才能使用
//全域性變數不初始化,預設賦值為0
//宣告只是針對全域性變數,不是針對區域性變數
//全域性變數只能定義一次,但是能宣告多次
//全域性變數在編譯階段已經分配空間(函式沒有執行前),只有在整個程式結束,才自動釋放
void
fun2()
void
fun3()
int a=10;
void
fun(
)int
main()
e.c語言全域性變數的缺陷#include
int a;
int a;
int a=0;
//定義,其他為宣告
int a;
int a;
int b;
int b;
int b;
int b;
//有一次是定義,其他為宣告
//如果定義乙個全域性變數,沒有賦值,無法確定是定義還是宣告
f.c語言全域性變數宣告和定義的建議寫法#include
//定義乙個全域性變數,建議初始化
int a=10;
//如果宣告乙個全域性變數,建議加extern
extern
int a;
g.static全域性變數
static全域性變數和普通全域性變數的區別就是作用域不一樣(檔案作用域)
extern關鍵字只適用於普通全域性變數
乙個檔案只能有乙個static全域性變數
static全域性變數只能在當前檔案使用,別的檔案不能使用
不同檔案只能出現乙個普通全域性變數的定義
乙個檔案只能有乙個static全域性變數的定義,不同檔案間的static全域性變數就算名字相同,也是沒有關係的兩個變數
h.普通函式和static函式的區別(檔案作用域)
所以檔案只能有乙個普通函式的定義
乙個檔案可以有乙個static函式的定義
普通函式所有檔案都能呼叫,前提是使用前宣告
static函式只能在定義所在的檔案中使用
i.總結
型別作用域
生命週期
auto變數
一對{}內
當前函式
static區域性變數
一對{}內
整個程式執行期
extern變數
整個程式
整個程式執行期
static全域性變數
當前檔案
整個程式執行期
extern函式
整個程式
整個程式執行期
static函式
當前檔案
整個程式執行期
register變數
一對{}內
當前函式
在程式沒有執行前,有幾個記憶體分割槽已經確定,雖然分割槽確定,但是沒有載入記憶體,程式只有執行時才載入記憶體:
當執行程式,載入記憶體,首先根據前面確定的記憶體分割槽(text,data,bsss)先載入,然後額外載入兩個區
#include
#include
intmain()
;int
*p=(
int*
)malloc
(1000000000
*sizeof
(int))
;if(p==null)
return0;
}
a.memset()#include
void
*memset
(void
*s,int c,size_t n)
;//功能:將s的記憶體區域的前n個字元以引數c填入
//引數:
//c:填充的字元:c雖然引數為int,但必須是unsigned char,範圍為0~255
//n:指定需要設定的大小
int a[10]
;memset
(a,0
,sizeof
(a))
;memset
(a,97
,sizeof
(a))
;int i=0;
for(i=
0;i<
10;i++
)
#include
#include
intmain()
b.memcpy的使用#include
intmain()
c.memmove和memcmp的使用#include
intmain()
;int b[10]
;//第3個引數是指拷貝記憶體的總大小
memcpy
(b,a,10*
sizeof
(int))
;memcpy
(b,a,
sizeof
(a))
;//使用memcpy()最好別出現記憶體重疊
//如果出現記憶體重疊,最好使用memmove
memcpu
(&a[2]
,a,5
*sizeof
(int))
;//err
memmove
(&a[2]
,a,5
*sizeof
(int))
;}
#include
intmain()
//malloc(sizeof(int));
//引數是指定堆區分配多大的空間
//失敗返回null
#include
#include
intmain()
//動態分配的空間,如果程式沒有結束,不會自動釋放
//一般使用完,需要人為釋放free()
//free(p);不是釋放p變數,而是釋放p所指向的記憶體
//同一塊堆區記憶體只能釋放一次、
//釋放不是指記憶體消失,而是指這塊記憶體使用者不能再使用,系統**了,如果使用者再用,就是操作非法記憶體
//記憶體洩漏:動態分配了空間,不釋放
C C 記憶體管理 new和delete
c 語言中的動態記憶體管理方式有malloc calloc realloc 和 free,但是 malloc 和 free 是函式,new 和 delete 是 c 用於管理堆記憶體的兩個運算子 1.內建型別操作void test1 動態申請10個int型別的空間。並初始化為 delete p1 d...
C 記憶體管理new和operator new
在c 中我們知道函式可以進行過載,而一些操作符也是可以過載的。比如new和delete操作符。我們知道new和delete是c 中負責申請記憶體空間和釋放空間的。針對與系統內建型別的變數的使用和操作就不過多介紹。今天看看針對於某個物件的使用。先給出乙個簡單的test類 class test test...
動態管理記憶體之new和delete
cpp中使用new運算子來動態申請特定數量的記憶體。一般通過new顯示申請的內存在變數銷毀的時候要通過delete顯示釋放記憶體還給系統。使得這塊記憶體空間可以被作業系統 以作它用。假如程式中動態分配了很多記憶體空間,但使用完畢後都不釋放,則這些空間無法用於儲存別的資料,將造成嚴重的記憶體浪費。一 ...