一:宏
宏定義又稱爲宏代換、宏替換,簡稱“宏”。
1.宏定義的格式
宏定義的一般格式是:
#define 宏名 宏體
宏名通常用英文大寫字母表示。列如:
#define YES 1
宏名如果出現在字符串中,編譯預處理不會對它進行替換。例如程序段
char *ps
ps=x==YES; printf(%s\n,ps);
變量ps右邊出現的YES不會被置換,輸出結果爲“x==YES”而不是“x==1”。
2. 宏定義的嵌套
嵌套的宏定義,就是用定義過的宏名去定義另一個宏名。例如:
#define WIDTH 80
#define LENGTH (WIDTH+40)
在第二個宏定義中,使用了前面定義過的宏名WIDTH。在編譯預處理時,程序中所有的WIDTH都被80所替換,所有的LENGTH又被(80+40)替換。
3. 宏定義的功能
(1) 定義符號常量:可以提高程序的運行效率
(2) 定義函數
例如:
#define POWER(X) ((X)*(X))
如下是打印0~99的平方的程序
int i;
for (i=0;i<100;i++)
printf(%d ,POWER(i));
易錯的一道程序:
#define SQUARE(n) ((n)*(n))
main()
{ int i=1;
while (i<=10)
printf(%d\n,SQUARE(i++));}
運行結果爲(2,12,30,56,90)經宏替換後,printf()函數語句被置換爲:
printf(%d\n,(i++)*(i++));
4. 宏定義的解除 #undef 宏名
(http://learn.akae.cn/media/ch21s02.html)
二:構造數據類型
2.1結構體
結構體類型的聲明
struct 結構體名
{ 成員列表
};
(1)“struct”是C語言的關鍵字,是結構體類型的標誌。
(2)結構體類型的大小是其所有成員所佔空間字節數相加之和。(在linux下,由於存在內存空洞,所佔字節數要滿足字對齊或半對齊)求空間字節數的方法:如下,n=8.注。在linux下,int爲4字節,char爲1字節。
struct date
{
char a;
int b;
};
int main()
{
struct date k;
int n;
n=sizeof(k);
printf("%d\n",n);
}
(3)花括號外的分號必不可少。
struct date
{ int year,month,day;
}sund;
(4)結構體類型的聲明還允許嵌套。如:
struct student
{
int num;
char name[20];
struct date birthday;
}stul;
(5)結構體變量的初始化,所有初值與各成員數據類型要匹配或兼容。
如:struct student stul={1306,“zhouyang”,1989,12,14};
(6)結構體變量的使用:結構體變量名.成員名(實心點是成員運算符,如:sund.year sund.month)。
(7)結構體變量作爲函數參數傳遞的是所有成員的數據。
(8)結構體指針。使用如下:
struct worker
{ int num;
char name[20];
}wk,*pw;
引用結構體元素中的成員:(*pw).num,或pw->num。即是wk.nume。
共同體類型
和結構體有很多相似之處,其主要特點是,共同體變量中的所有成員佔用同一段存儲空間,這段空間的大小就是所有成員中字節數最大的值。在linux下,要滿足字對齊或半對齊。(內存空洞的產生)
枚舉類型(enum)
枚舉類型就是一一列舉出來變量的值,然後此變量就只能使用列舉出來的值。
枚舉類型定義的一般形式爲:enum 枚舉名 {枚舉值表};
例如:
enum weekday
{ sun,mou,tue,wed,thu,fri,sat };
定義枚舉類型變量:enum weekday a,b,c;或
enum weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
注意點:(1)枚舉值是常量,不是變量,不能在程序中用賦值語句再對它賦值。“sun=1; mon=2;”是錯誤的。
(2)枚舉元素本身有系統定義了一個表示序號的數值,從0開始順序定義爲0、1、2、3.....。如sun=0,mon=1.
typedef自定義類型
基本格式:typedef 基本數據類型符 用戶自定義數據類型符 (相當於替換)