C語言重要概念匯總
作者:郭孝星
微博:郭孝星的新浪微博
郵箱:[email protected]
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
一 基本概念
1.1 關鍵字static的作用
- 在函數體。一個被聲明為靜態的變量在這一函數被調用的過程中維持其值不變。
- 在模塊內(但在函數體外),一個被聲明為靜態的變量能夠被模塊內所用的函數調用,但不能被模塊外的其他函數訪問。它是一個本地的全局變量。
- 在模塊內,一個被聲明為靜態的函數僅僅能夠被這一模塊內的其他函數調用。那就是這個函數被限制在它的模塊的本地範圍內使用。
1.2 引用和指針的差別
- 引用變量必須初始化,指針不必。
- 引用初始化以後不能被改變。指針能夠改變所指的對象。
- 不存在指向空值的引用,可是存在指向空值的指針。
1.3 #include
1.4 全局變量和局部變量在內存中存放位置的差別
全局變量存放在靜態區中,局部變量存放在堆棧中。
1.5 堆棧溢出的原因
- 沒有回收垃圾資源。
- 層次太深的遞歸調用。
1.6 引用一個已經定義過的全局變量
- 引用頭文件的方式。假如定義的那個變量出錯,那麽編譯器就會報錯。
- 用extern關鍵字方式引用。假如定義的變量出錯,則編譯器間不會報錯,而在連接期間報錯。
1.7 全局變量能否定義在多個.c文件包括的頭文件裏
能夠。在不同的.c文件裏以static形式來聲明同名全局變量。前提是當中僅僅能有一個C文件對此變量賦初值,此時連接時不會出錯。
1.8 for( ; 1 ; )是什麽意思
和while(1)同樣,無限循環。
1.9 static 全局變量、局部變量、函數與普通全局變量、局部變量、函數
全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式,兩者在存儲方式上並無差別。而非靜態全局變量在各個源文件裏都是有效的。而靜態全局變量則僅僅在定義該變量的源文件有效。static全局變量值初始化一次,防止在其他文件單元中被引用。
因此,把局部變量改成靜態變量後改變了它的存儲方式即該變了它的生存期。而全局變量改成靜態變量後改變了它的作用域,限制了它的使用範圍。
static局部變量僅僅初始化一次,下一次根據上一次的結果值。
static函數與普通函數的作用域不同,僅在本文件。僅僅在當前文件裏使用的函數應該說明為內部函數。static函數在內存中僅僅有一份。普通函數在每一個調用中都維持一份拷貝。
1.10 程序的內存分配
- 棧區(stack):由編譯器自己主動分配釋放,存放函數的參數值。局部變量的值,其操作方式相似於數據結構中棧。
- 堆區(heap):一般由程序猿分配釋放。若程序猿不釋放, 程序結束時可能有操作系統回收。它與數據結構中的堆是不同的。其分配方式相似於鏈表。
- 全局區(靜態區static):全局變量和靜態變量的存儲是是放在一塊的。
初始化的全局變量和靜態變量放在一塊區域,未初始化的全局變量和靜態變量放在響鈴的還有一塊區域。
- 文字常量區:存放常量的字符。程結束後由統釋放。
- 程序代碼區:存放函數體的二進制代碼。
舉例
int a = 0; //全局初始化區
char *p1; //全局未初始化區
main()
{
int b;
char s[] = “abc”; //棧
char *p2; //棧
char *p3 = “123456”;
static int c = 0; //全局初始化區
p1 = (char *)malloc(10);
p1 = (char *)malloc(10); //分配分配得來10和20字節區域在堆區
strcpy(p1, “123456”); //123456\0放在常量區。編譯器可能將它與“1223456”優化成一個地方。
}
1.11 堆和棧的差別
申請方式
- 棧:由系統自己主動分配。
- 堆:由程序猿申請,並指明大小。
C:p1 = (char *)malloc(10);
C++:p2 = (char *)malloc(10);
註意:p1和p2本身是在棧中。
申請後系統的響應
- 棧:僅僅有棧的剩余空間大於申請的空間。系統將為程序提供內存,否則將提示棧溢出。
- 堆:首先系統中會有一個記錄空暇內存地址的鏈表。系統受到程序的申請時會編立該鏈表,尋找第一個空間大於所申請的堆結點,並把該結點的空間分配菲程序。
同一時候,系統會在這塊內存空間的首地址記錄本次分配的大小,這樣delete語句才幹正確的釋放本內存空間。
另外。由於找到的堆結點的大小並不一定正好等於申請的大小,系統會自己主動的將多余的那部分又一次放入空暇鏈表中。
1.12 指針數組與數組指針
int(*p)[4],這個就是行指針這樣的類型的指針p是指向一個一維數組。這個一維數組包括4個整形元素。
可是 int a[4];p=a; 這樣的方式卻是不正確的由於p僅僅能指向一個整型的一維數組,不能指向一個整型數據,a所指向的正是a[0]。是個整型數。
實際上int(*p)[4]這樣的類型的指針是用於多維數組中的。比方定義一個二維數組int b[3][4],就能夠這樣賦值p=&b[0],使p指向一維數組b[0],並且p的增減是以一維數組的長度為單位的,比方p+1指向的就是b[1]了
int *p[4]這個是指針數組了,首先弄明確這個是數組,裏面存放的是指針也就是地址。這個地址所指向的是一個整型數據。你能夠把p[0],p[1]….當作一個個的指針變量來使用。
C語言重要概念匯總