關鍵字
static 靜态類 //隻有函數在多次調用時定義
局部變量加static會将存儲位置從棧區存到全局變量區
全局變量聲明static隻有目前檔案能使用
const關鍵字
const int* a; int const *a; 指針常量
是一個指向const int型的指針,a所指向的記憶體單元不可改寫,是以(*a)++是不允許的,但a可以改寫,是以a++是允許的。
int* const a; 常量指針
a是一個指向int型的const指針,*a是可以改寫的,但a不允許改寫。
int const * const a;
a是一個指向const int型的const指針,是以*a和a都不允許改寫
extern 存儲類
extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程式檔案都是可見的。當您使用 extern 時,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
當您有多個檔案且定義了一個可以在其他檔案中使用的全局變量或函數時,可以在其他檔案中使用 extern 來得到已定義的變量或函數的引用。可以這麼了解,extern 是用來在另一個檔案中聲明一個全局變量或函數。
extern 修飾符通常用于當有兩個或多個檔案共享相同的全局變量或函數的時候
struct 結構體
C 數組允許定義可存儲相同類型資料項的變量,結構是 C 程式設計中另一種使用者自定義的可用的資料類型,它允許您存儲不同類型的資料項。
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,
struct NODE {
char string[100];
struct NODE *next_node;
};
struct COMPLEX {
char string[100];
struct SIMPLE a;
};
如果兩個結構體互相包含,則需要對其中任意一個結構體進行不完整聲明,
struct B; //對結構體B進行不完整聲明
//結構體A中包含指向結構體B的指針
struct A {
struct B *partner;
//other members;
};
//結構體B中包含指向結構體A的指針,在A聲明完後,B也随之進行聲明
struct B {
struct A *partner;
//other members;
};
結構體成員引用:結構體變量名.成員名 || 結構體變量名->成員名
如 stu.num stu.name stu.score
(*p).num (*p).name (*p).score
p->num p->name p->score
結構體指派
解決記憶體空洞
同類型的成員定義放在一起
32位
若存在int型則結構體按字對齊(四位元組) 若存在short型不存在int型按半字對齊(2位元組)
數組名不能作為左值 給字元數組指派隻能用拷貝 strcpy(stu1.name,”Li Ming”);
不能将一個結構體作為一個整體進行輸入輸出
union 聯合體/共用體
當多個基本資料類型或複合資料結構要占用同一片記憶體時,我們要使用聯合體; 當多種類型,多個對象,多個事物隻取其一時(我們姑且通俗地稱其為“n 選1”),我們也可以使用聯合體來發揮其長處;
位元組序轉換
存放順序
大端和小端
可通過union共用體 來檢視電腦的大小端排列
網絡位元組序就是大端位元組序
枚舉enum //避免幻數
enum預設值 為 0,1,2,3,4 ...........
enum kids{nippy, slats, skippy, nina ,liz};//nippy = 0 ;slats = 1..........
*沒有傳遞性
int* a,b; a是指針 b是整數變量
typedef 資料類型
typedef是C語言的關鍵字,其作用是為一種資料類型定義一個新名字
格式:typedef 資料類型 自定義資料類型
C語言宏定義和宏定義函數
define MAX(a, b) ((a)>(b)?(a):(b))
k = MAX(i&0x0f, j&0x0f)
k = ((i&0x0f)>(j&0x0f)?(i&0x0f):(j&0x0f))
帶參數的宏體,形參要加上(),将執行頻率高的函數定義成宏函數以此提高程式效率
隻有簡單函數可以寫成宏函數
一些任務根本無法用函數實作,但是用宏定義卻很好實作。比如參數類型沒法作為參數傳遞給函數,但是可以把參數類型傳遞給帶參的宏。
看下面的例子:
#define MALLOC(n, type) \
( (type *) malloc((n)* sizeof(type)))
利用這個宏,我們就可以為任何類型配置設定一段我們指定的空間大小,并傳回指向這段空間的指針。我們可以觀察一下這個宏确切的工作過程:
int *ptr;
ptr = MALLOC ( 5, int );
将這宏展開以後的結果:
ptr = (int *) malloc ( (5) * sizeof(int) );
這個例子是宏定義的經典應用之一,完成了函數不能完成的功能,但是宏定義也不能濫用,通常,如果相同的代碼需要出現在程式的幾個地方,更好的方法是把它實作為一個函數
判斷
if
一個 if 語句 由一個布爾表達式後跟一個或多個語句組成。
if else
一個 if 語句 後可跟一個可選的 else 語句,else 語句在布爾表達式為假時執行
嵌套if語句
可以在一個 if 或 else if 語句内使用另一個 if 或 else if 語句。
Switch語句
一個 switch 語句允許測試一個變量等于多個值時的情況
嵌套Switch語句
可以在一個 switch 語句内使用另一個 switch 語句
ps:每個case 語句的結尾不要忘了加break,否則将導緻多個分支重疊(除非有意使多個分支重疊); 不要忘記最後那個default 分支。即使程式真的不需要default 處理,也應該保留語句 default : break; 這樣做并非多此一舉,而是為了防止别人誤以為你忘了default 處理。
位運算