本質:固定記憶體大小的別名
本質:連續儲存空間的別名
#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只對編譯器有用,,執行時無用,仍然可用指標改變值
const修飾的陣列是唯讀的int main()
const修飾的陣列空間不可改變
const修飾指標左數右指:const在*左邊指標指向的資料為常量,const在 *右邊指標本身為常量
const修飾函式
多用於返回指標,表示返回值不可改變
編譯器警告指示字const volatile int i=0是否合理,參考用於告訴編譯器必須每次都去從記憶體中取值,避免優化c
主要用於多執行緒訪問的變數
也可修飾可能被未知因數更改的變數
空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;
}
共享空間,選最大的
定義自定義型別enum #define對比變數只能取定義時的離散值,預設常量在前乙個值的基礎上+1
#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關鍵字有另一種意思當應用到全...