Head First C Ch1 to Ch6


一些值得注意的小細節


目錄


因為前面的內容比較基本,就只挑一些比較有趣(或比較沒看過)的功能來介紹~

A && B 表示「假如A執行成功的話,就緊接著執行B」


例如編譯後馬上執行

$ gcc zork.c -o zork && ./zork

break 不能用來中斷 if 陳述式


誤用 break 去中斷 if 的後果可以看這裡(The 1990 AT&T Long Distance Network Collapse)

串接指定


x = 4 運算式本身也具有回傳值 4
所以說 y = x = 4; 就是把 y 設定成 x = 4 的回傳值 4
i.e. 把 xy 都設成 4

陣列變數當作指標使用


doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]

所以 doses[3]3[doses] 是一樣意思的喔~

字串實字(String literals)永遠不能被更新


指向字串實字的變數不能用來改變該字串的內容

char *cards = "JQK";
cards[2] = cards[1]; // 這不合法!!

如果從字串實字重新建立一個陣列,就能夠修改該陣列

char cards[] = "JQK";
cards[2] = cards[1]; // 合法!!

記憶體存儲器(位址由高至低)


名稱 用途
Stack(堆疊) 區域變數(local variables)
Heap(堆積) 動態記憶體(dynamic memory)
Globals(全域區段) 全域變數(global variables)
Constants(常數區段) 唯讀
Code(程式碼區段) 唯讀

指標構成的陣列


char* name_for_dog[] = {"Bowser", "Bonza", "Snodgrass"};

每個字串實字都會有一個指標指向他

| 符號(管線)是將一個行程之標準輸出連結到另一個行程之標準輸入的符號


$ (./bermuda | ./geo2json) < spooky.csv > output.json

命令列選項(command-line option)


內容待補(P.149)

struct指標表示法(t是指向struct的指標)


(*t).aget->age 這兩個表達式表達同一件事

strdup() 函式能夠在 heap 某處重新產生該字串的完整副本


char *copy = strdup(s);

strdup()string.h中,函式計算該字串多長,然後呼叫malloc()函式,在 heap 上配置正確數量的字元

See also