C陷阱和缺陷,必須知道的495個C語言問題

蝸牛_Wolf發表於2019-01-03

C陷阱和缺陷
1,將常數0轉型為“指向返回值為void的函式的指標”型別:(void (*)())0
2,巨集定義不要忽視空格
必須知道的495個C語言問題
 1,typedef int (*funcptr)();意思是定義了一個型別funcptr,表示指向返回值為int型(引數未指明)的函式的指標。它可以用來宣告一個或多個函式指標。
 2,如何宣告返回指向同型別函式的指標的函式?即函式指標返回一個函式指標;設計一個狀態機,用函式表示每種狀態,每個函式都會返回一個指向下一個狀態的函式的指標。
    不能直接完成這個任務:一種方法是讓函式返回一個一般的函式指標,然後在傳遞這個指標的時候進行適當的型別轉換
    typedef int (*funcptr) ();//一般的函式指標
    typedef funcptr (*ptrfuncptr) ();//指向函式返回的函式指標
    funcptr start(),stop(); funcptr state1(),state2(),state3();
    void statemachine()
        {
            ptrfuncptr state=start;
            while(state!=stop)
            {
            state=(ptrfuncptr)(*state)();
            }
        }
        funcptr start(){ return (funcptr) state1;}
    第二個型別定義ptrfuncptr隱藏了一些十分隱晦的語法。如果沒有這個定義,變數必須宣告為(funcptr)(*state)(),而呼叫的時候就得用(funcptr(*)())(*state)()
3,函式呼叫只能出現在自動變數(即區域性非靜態變數)的初始式中。
4,右值既不能賦值,也不能自增。void *指標只能儲存物件(資料)指標,將函式指標轉換為void*是不可移植的。所有的函式指標型別都可以相互轉換,只要在呼叫前轉回
正確的型別即可,因此,可以使用任何函式型別(int (*) ())或void (*) () 即未指明引數,返回型別int或void的函式。
5,陣列是一個由同一型別的連續元素組成的預先分配的記憶體塊,指標是一個對任何位置的(特定型別的)資料元素的引用。陣列自動分配空間但不能重分配或改變大小。指標必須被賦值以指向分配空間
    可以使用malloc但是可以隨意重新賦值指向不同物件。
6,陣列和下標可以互換。
7,動態的分配多維陣列:分配一個指標陣列,然後把每個指標初始化為動態分配的“行”;for迴圈
8,多數malloc/free的實現並不把釋放的記憶體返回作業系統,而是留著供同一程式的後續malloc使用。
9,在定義函式式的巨集的時候:巨集擴充套件必須使用括號,以便保護表示式中低優先順序的操作符;在巨集定義內部,所有引數的出現必須用括號括起來,以便保護實參中任何低優先順序的操作符不受巨集擴充套件的其他部分影響。

相關文章