static
static的作用有三點:一、static修飾局部變量,稱為靜態局部變量,延長了局部變量的生命周期,使得該變量在整個程序運行結束後再釋放;二、static修飾全局變量,稱為靜態全局變量,只能在本文件中訪問,不能再其他文件中訪問;三、static修飾函數,稱為靜態函數,只能在本文件中調用,不能再其他文件中調用;當一個文件中同時出現了非靜態函數和靜態函數,一定要將靜態函數定義在非靜態函數之前,或者在非靜態函數前先申明靜態函數,然後在後面定義靜態函數。
另外,靜態變量存儲在虛擬地址空間的 .data 段,沒有初始化時,系統默認初始化為零。
使用static的三種情況:一、當我們希望延長局部變量的生命周期時,用static修飾局部變量;此時靜態局部變量的作用與全局變量相同,但靜態局部變量比全局變量更加安全;二、當我們想讓全局變量只能在本文件中可訪問,或者想修改重定義全局變量的時候,使用static修飾全局變量;三、當我們想讓函數只能在本文件中可調用,使用static修飾函數。
const
const修飾變量稱為只讀變量,不能通過const修飾的變量名來修改對應空間的值;使用num修飾變量,一定要進行初始化;const修飾形參,可以避免在函數實現過程中修改實參的值。
const的修飾准則:近水樓台先得月,離誰近,就是修飾的誰
例:
[code] const int num = 5;//const 修飾 num,不可以num++;但可以通過其他方式改變 num對應空間裡的值; const int * p = #//const 離*p更近,不能通過*p修改num對應空間的值(*p)++; int const * p = #//const 離*p更近,不能通過*p修改num對應空間的值(*p)++; int * const p = #//const 離p更近,不能通過p修改num對應空間的值p++;extern
extern 是外部聲明,在當前文件中要使用其他文件中定義的全局變量或者函數,就要再當前文件中聲明要使用的變量或者函數。
typedef
typedef 給基本數據類型進行重命名,提高了代碼的移植性,將復雜的數據類型名變為簡答的名字,方便編寫程序,同時,也方便我們定義變量,對變量起到了注釋的作用。
struct student stu;//定義結構體變量
結構體變量 . 結構體成員
結構體指針 -> 結構體成員
*字對齊和半字對齊
字對齊:給每個結構體成員分配4個字節的空間
半字對齊:給每個結構體成員分配2個字節的空間
定義結構體數據成員的時候盡量把同類型的數據放在一起以減少內存空洞
*函數如何返回多個值
①使用傳入參數
②返回結構體變量
sizeof(struct student) 由所有成員的長度之和決定
union 共用體
訪問與結構體一樣
sizeof(union )由成員中最長的決定
所有的成員公用一個空間會產生覆蓋
*大端字節序和小端字節序
int num = 0x12345678;
其中,12為高字節,78為低字節
小端存放 :將低字節存放在低地址中
大端存放 :將高字節存放在低地址中
驗證CPU是大端存放還是小端存放
利用共用體的空間覆蓋性
[code]#include<stdio.h> union demo { int num; char ch; }; int main() { union demo demo1; demo1.num = 0x12345678; char *p = # if(demo1.ch == 0x78) //if(*p == 0x78) { printf("小端存放\n"); } else { printf("大端存放\n"); } return 0; }enum 枚舉
訪問:
[code]printf("p.A = %d\n",A); enum node p = A; printf("p.A = %d\n",p);枚舉相當於整數宏
int len = 3;//3 是幻數,數字沒有解釋能力
③宏函數(函數式宏定義)
宏函數是傻瓜式替換,不做語法檢查,不安全,但效率高
自定義函數,做語法檢查,安全,但效率低
用編譯時間換內存空間的例子(用時間換空間):宏函數
用內存空間換運行時間的例子(用空間換時間):inline函數(內聯函數、內嵌函數)
④內置宏定義
[code]printf("%d\n",__LINE__); printf("%s : %d",__func__,__LINE__); // __DATA__,__TIME__
[code]#if 0 ... #endif②防止頭文件重復包含帶來的重復定義
[code]#ifndef A_H #define A_H ... #endif判斷 bool 值
[code]if(flag) //if(!flag)