the c programing language 學習過程6
payroll工資名單 hierarchy分層層次 vexing 使人煩惱的 alignment結盟 semantics 語義 aethetic審美 parameterize 參數化
1結構標記 成員 和普通變量(非成員) 可以用相同的名字 不同結構裏的成員也可以用相同名字 但是最好別這麽搞
2結構成員可以用.鏈接 如 pt.x maxpt.y 在嵌套的情況下 如 struct rect { struct point pt1;}; struct rect screen; screen.pt1.x; 也可以這麽調用
3如果結構很大 可以用指針數組 struct point *pp; (*pp).x是一個成員.優先級比*高 或者 pp->x
4struct { int lenp;} *p; ++p->len;加的是len 因為所有運算符裏 . -> () []運算優先級最高 你可以用 (++p)->len; (p++)->len則不用加括號
5結構數組
struct key {
char *word;
int count;
};
struct key keytab[NEYS];
struct key {
char *word;
int count;
} keytab[]={
"auto",0,
"break",0,
.......
"while",0};
更好的方法是{"auto“,0},{“break”,0},......,{“while”,0}; 但是如果只是簡單變量或者字符串 而且任何變量都不空 可以用前者表示
6結構裏面的項數不用數可以 #define NKEYS (sizeof keytab/sizeof keytab[0]]
7對於三個指針來說 mid low high mid = (low+high)/2 是錯誤的 mid = low+(high-low)/2; &tab[-1]和&tab[n]都是非法的 (n項數組) 但是&tab[n]是可以執行的
8
struct key {
char word;
int count;
} 因為不同對象可能有對齊要求 char 是一個字符 int 是4個字符 但是這個結構沒準就是8個字符而不是五個 這叫做空穴 holes 這種情況用sizeof就比較好了
9 struct key * binsearch(char * word, struct key * tab,int n) 函數名可能找不到 而下面這樣寫就比較清晰 當然這個無傷大雅
struct key *
binsearch(char * word, struct key * tab,int n)
10二叉樹挺重要的 多看看 我這塊挺清楚的 就不絮叨了
結構內有包含自身結構的成員是非法的 但是指針可以
11 typedef char * String; 讓string變成了一個 char* 可以 String p; String lineptr[MAXLINES] 一般首字母大寫以示區別
12typedefy是編譯器處理的 他的文本替換功能要超過預處理器(#define的情況)
如 typedef int (*PFI)(char *,char *) PFI是一個有兩個char *參數 返回int的函數
typedef在移植的時候很方便 只要修改定義的變量就行 同樣 定義一個容易懂的名字也增加了可讀性
13任何聯合內類型的變量都可以賦值給聯合 但是之後使用讀取時要保持一致 否則結果將取決於具體實現 聯合存儲空間為成員最“寬“類型的大小
struct{
char *name;
union{
int ival;
float fval;
char *sval;}u;}symtab[NSYM];
symtab[i].u.sval[0]
14位字段
方式1 可以用#define KEYWORD 01
#define EXTRENAL 02
#define STATIC 04
俗稱屏蔽碼來打開關閉某一個位
flags |= EXTERNAL | STATIC; (|是按位或) 就是打開EXTERNAL 和STATIC位
flags &= ~(EXTERNAL | STATIC); 則是關閉這兩個位置的
當然還有一種更直接的方式
如
struct{
unsigned int is _keyword:1;
unsigned int is _extern:1;
unsigned int is _static:1;
}flags; 這裏定義了一個flags變量 包含三個1位的字段 (冒號之後作為寬度)
可以設置 flags.is_extern = flags.is_static =1 就把這兩位打開了
寬度0可以用來在強制在下一個字邊界對齊? 一個冒號加上寬度 但是沒名字可以起到填充作用
有些機器是字段分配是從左到右 有些則相反 所以維護內部數據很有用 對於外部數據要搞清楚哪端優先 所以程序可能沒辦法移植
字段只能聲明為int 為了方便移植 最好聲明為 unsigned int 字段也不是數組 沒有地址
the c programing language 學習過程6