1. 程式人生 > >the c programing language 學習過程6

the c programing language 學習過程6

否則 typedef 關閉 word per 聲明 ron 數組 orm

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