Posts

Showing posts from June, 2011

[C] 關於static variable的宣告

static variable跟一般variable的宣告方式, 差別是在程式執行開始到結束之前都存在記憶體中. (1)當static variable為Local variable時: void myFunc(int n) { static int num = 0; num += n; } => num在宣告為static後, 儘管離開myFunc()後仍會一直存在, 而且每次執行myFunc會進行num的累加(而不是從0開始) (2)當static variable為global variable時: 當在a.c中宣告 static int num = 0後, num只能被a.c這個檔案所引用, 而不能被其他.c或.h檔使用(即無法在其他檔案中宣告extern int num;) (NOTE)若在.h檔中宣告int num; 表示每個引用的.c檔會發生錯誤(multiple definition). 若宣告為static int num; 則每個引用的.c檔都會copy一份num變數. 建議最好不要在.h檔中宣告變數, 若需要不同.c檔共用同一個變數, 可以使用: (a)在某個.c檔裡頭宣告, 然後在其.h檔宣告extern. 需要引用該變數的.c檔則將該.h加入 (b)使用function call的方式取得 若每個.c都需要有各自的int num, 則各自宣告為static int num. 恩, 目前理解是如此, 有問題再來修改...

[c] 涵式的指標參數

平常寫一個指標參數都很直覺得寫, 今天想到一個有趣的記法, 在這裡筆記一下.. 最基本的是我們要傳 reference of variable時: 1: int a; 2: rewrite(&a); 3: void rewrite(int *a); 若忘記參數要怎宣告, 想到一個很有趣的記法就是, 由右往左推: a. 在2時傳入a的位址, 勢必以 *a型態記錄 b. 而參考1, a是type int, 所以宣告 int. => "int *a" ex. 1: char *str=NULL; 2: rename(&str); 3: void rename(char **str2); str是個pointer, 存一個type char的address 在rename()中傳入一個address -> *str 又str是一個char * -> char**str &str == str2 *str2 = (char*)malloc(...)