1.編輯器設計者的金科玉律:效率(幾乎)就是一切 2.閱讀ANSIC標准 , 尋找樂趣和裨益 具體的ANSI C標准的規定我都不說了,從中看出 char * 類型是可以作為參數專遞的,但是char** 是不行的,所以我們 傳遞多維數組的時候要表明確前n-1維的下標 3.容易混亂的const [cpp] int main(int argc, char* argv[]) { //定義基本類型的const變量,const 位置在哪兒都可以 const int x = 2,y = 3; //兩個常量 //定義一個非const變量 int z = 3; //一個普通變量 //定義一個指向常的指針 const int* pc = &x; //指向常量的指針 //定義一個常指針 int* const cp = &z; //常指針 //定義一個非const指針 int* pp = &z; //int 型指針 pc = &z; //可以,pc是一個指向常量的指針,不能通過該指針去修改指針所指向的內存空間的值,但是,該指針可以指向別的變量 // *pc = 10; //不可以,*pc所指向的地址為const變量,其值不可更改 pc是一個指向常量的指針,不能通過該指針去修改指針所指向的內存空間的值 pc = pp; //可以,pc為指針,其值可被改變 pc是一個指向常量的指針,pp是一個普通指針,用一個普通指針給一個指向常量的指針賦值是可以的 // pp = pc; //用一個指向常量的指針,賦值給一個普通指針,不可以。如果可以,那麼就可以通過普通的指針去修改內存的值 *cp = x; //可以,通過常指針去修改指針所指向變量的值是可以的 // cp = &x; //不可以,cp為常指針,指針的值不能被修改,給常指針賦值是錯誤的 // pp = &x; //不可以,pp是非const指針,原則上來講給它賦值是可以的,在不同的編譯器下有不同的結果 // pp = pc; //不可以,指向常量的指針不能賦值給一個普通的指針 pp = cp; //可以,常指針可以賦值給一個普通指針 const int * const pp = &a; //雙const 既保護指針又保護內存變量 return 0; } 4.ASINC 手冊重新編寫了有關內容整型升級和尋常算數轉換 注意: #define TOTAL_ELEMENTS ( int )( sizeof(array) / sizeof(array[0]) ) 必須加上(int)強制轉換,不然運算的結果是個 unsigned int 類型,在程序中與有符號數運算時會發生意想不到結果 5. 錯誤斷言 無論什麼時候遇見 malloc(strlen(str)) 都是錯誤的 而 malloc(strlen(str) + 1) 是正確的 因為字符串處理包含了一個額外的空間,用於容納字符串結尾的‘\0’ 6. 一個‘L’的NUL 和 兩個 ‘L’的NULL 7. switch 中case 後面不用break 97%都是錯誤的,而且default這單詞如果寫錯的話,編譯器是不檢測的。 8. 在字符串數組在初始化的時候,如果不小心漏掉了一個逗號,編譯器不會發出錯誤信息,而是悄無聲息地把兩個字符串合起來 [cpp] #include<stdio.h> #include<string.h> #define TOTAL_ELEMENTS (int)(sizeof(str)/sizeof(str[0])) int main() { char *str[] = { "aaa", "bbb", "ccc", "ddd" "eee", }; printf("the length of the array is %d\n",TOTAL_ELEMENTS); for(int i = 0; i < TOTAL_ELEMENTS; i++) puts(str[i]); return 1; } 結果: 9. 使一段代碼第一次執行的行為與以後執行時間不同(函數中申請靜態變量) 10. i = 1, 2; 的結果是i 為多少呢? 賦值運算符的優先級高於逗號,所以 實際情況為: (i = 1), 2 , 所以i 最終的值為1 而 i = (1 ,2);的結果i 為2; 11.計算的次序