c語言深度解剖 關鍵字

2021-10-01 22:22:41 字數 4204 閱讀 5891

本質:固定記憶體大小的別名

本質:連續儲存空間的別名

#include ​

typedef int int32;

typedef unsigned char byte ;

typedef struct _demo demo;

​int main()

編譯器預設所有區域性變數都是auto屬性,在棧上分配空間

如果修飾全域性變數報錯

靜態屬性+作用域限定符

變數在程式的靜態區分配空間

作用域僅限於定義它的檔案中

靜態區域性變數只會被初始化一次

將變數存到暫存器中

不能用&獲取register變數的位址,因為暫存器不在記憶體中

修飾全域性則報錯,因為全域性變數存在於整個程式執行期間,全域性變數長期要放於暫存器中,最終都分配後無暫存器可用

#include auto int g = 9; // error

​register int m=0;//error

​int main()

#include ​

void f1()

​void f2()

​int main()

for (i = 0; i < 5; ++i)

}

bool型變數應該直接出現於條件中,不要進行比較,不同的編譯器對true定義不同,false始終為0

普通變數和0比較時,0應該出現在比較符號左邊

float變數不能直接和0比,需要定義精度

#include ​

typedef enum _bool bool; //列舉定義bool​​

​int main()

else

float f = 5.0;

if ((5 - e <= f) && (5 + e <= f))

return 0;

}

case中的值只能是整型或字元型

對比

if適合範圍型

switch適用離散值,對多分支簡潔

do先執行後判斷,至少執行一次

while先判斷後執行,可能不執行

for先判斷後執行,比while簡潔

#include ​

int f1(int n)

return ret;}​

int f2(int n)

​int f3(int n)

while( n>0 );

// }

// 這裡可能會出現負數

return ret;}​

int main()

do-while為何要存在

int func(int n) 

ret = 1;

} while (0);

//釋放記憶體

free(p);

return ret;

}

對比

int func(int n) 

ret = 1;

//} while (0);

​ free(p);

return ret;}​

//如果 n<0條件就退出,那麼p沒有free有記憶體洩漏

//採用do-while記憶體調配只有乙個入口乙個出口,避免了記憶體洩漏

break 退出迴圈體

continue推出當前迴圈

避免使用!

沒有返回值/引數用void修飾

不存在void變數

有void*指標,作為左值可接受任意型別的指標,作為右值賦值需要強制型別轉換

#include ​

void* m_memset(void* p, char v, int size)

return ret;}​

int main() ;

int i = 0;

for (i = 0; i < 5; i++)

​ m_memset(a, 0, sizeof(a));

​ for (i = 0; i < 5; i++)

return 0;

}

宣告外部定義的變數和函式

告訴編譯器使用c方式編譯(用在c++中),gcc編譯不過,g++過

extern "c"

}

sizeof是編譯器內建指示符,不是函式

用於計算所佔記憶體大小

sizeof的值在編譯期已經確定了,不需要執行

int main() 

修飾唯讀變數,本質還是變數

const修飾的變數會在記憶體占用空間

本質const只對編譯器有用,,執行時無用,仍然可用指標改變值

int main()
const修飾的陣列是唯讀的

const修飾的陣列空間不可改變

const修飾指標

左數右指:const在*左邊指標指向的資料為常量,const在 *右邊指標本身為常量

const修飾函式

多用於返回指標,表示返回值不可改變

編譯器警告指示字

用於告訴編譯器必須每次都去從記憶體中取值,避免優化c

主要用於多執行緒訪問的變數

也可修飾可能被未知因數更改的變數

const volatile int i=0是否合理,參考

空struct避免使用,可能為1或者報錯

柔性陣列:大小待定,struct最後的乙個元素可以是大小未知的陣列,大小為除了最後乙個陣列之外的大小

#include ​

typedef struct _soft_array softarray;

​int main()

printf("%d\n", sizeof(s));

}

#include #include //柔性陣列實現斐波那契數列

typedef struct _soft_array

softarray;

​softarray* create_soft_array(int size)

return ret;}​

void fac(softarray* sa)

else

}} }​

void delete_soft_array(softarray* sa)

​int main()

delete_soft_array(sa);

return 0;

}

共享空間,選最大的

定義自定義型別

變數只能取定義時的離散值,預設常量在前乙個值的基礎上+1

enum #define對比

#define只是值替換,列舉常量是真正的常量

#define巨集常量無法被除錯,列舉常量可

#define巨集常量沒有型別資訊,列舉常量是一種特定型別的常量

typedef 用於給乙個已經存在的資料型別重新命名

typedef char* pchar;

#define pchar2 char*

​pchar p1, p2;

pchar2 p3, p4; //p4是char型

enum關鍵字 C語言深度剖析

列舉型別的定義方式如下 enum enum type name enum const 1,enum const 2,enum const n enum variable name 注意 enum type name是自定義的一種資料型別名,而enum variable name為enum type ...

C語言深度剖析之關鍵字

static int j void fun1 void void fun2 void int main return 0 sizeof是關鍵字而不是函式int main printf d strlen a return 0 bool變數與 零值 進行比較 bool btestflag false i...

C語言關鍵字

c語言關鍵字 在檔案範圍的教訓和關鍵字,你知道靜態變數保持他們的價值觀,甚至不在他們超出範圍的破壞。比如說呢。int generateid int main this program prints 01 2 請注意,s nid一直保持它的價值的跨多個函式呼叫。static關鍵字有另一種意思當應用到全...