1. 程式人生 > >C語言結構體及typedef關鍵字定義結構體別名和函式指標的應用

C語言結構體及typedef關鍵字定義結構體別名和函式指標的應用

結構體(struct)的初始化

struct   autonlist   {   
        char   *symbol;   
        struct   nlist   nl[2];   
        struct   autonlist   *left,   *right;   
  };   </span>

 struct   autonlist   *nlists   =   0;   
 symbol*symbolnl[0]nl[1]*leftleft*rightright會初始化成什麼?

 先搞清這句話的意思:   
  struct   autonlist   *nlists   =   0;   

 等價於:struct   autonlist   *nlists   =   NULL;   

 這句話定義了一個autonlist結構的指標nlists,然後初始化指標為NULL,以防止被後面的語句誤用(主要就是防止未對該指標賦值造成的記憶體錯誤,野指標操作);既然這只是對指標的初始化,還使這個指標指向相應的結構變數,當然就不存在對結構的成員進行初始化的操作。

  //*symbolnl[0]nl[1]*left*right     //這些要自己去顯示的初始化,系統預設的都是危險的,一般在用到結構體時要自己去初始化他們

typedef定義別名

typedef struct   autonlist   {   
        char   *symbol;   
        struct   nlist   nl[2];   
        struct   autonlist   *left,   *right;   
  }auto;  </span>
在使用typedef對結構體autonlist進行定義別名後,定義結構體的時候直接使用auto就可以了。 例如:        auto *nlist; 即定義了一個結構體指標能力nlist。

typedef定義函式指標

關於C++中函式指標的使用(包含對typedef用法的討論) 
(一)簡單的函式指標的應用。 
//形式1:返回型別(*函式名)(引數表) 
char (*pFun)(int); 
char glFun(int a) { return ;} 
void main() 

    pFun = glFun; 
    (*pFun)(2); 
}
 
       第一行定義了一個指標變數pFun。首先我們根據前面提到的“形式1”認識到它是一個指向某種函式的指標,這種函式引數是一個int型,返回值是char型別。只有第一句我們還無法使用這個指標,因為我們還未對它進行賦值。 
       第二行定義了一個函式glFun()。該函式正好是一個以int為引數返回char的函式。我們要從指標的層次上理解函式——函式的函式名實際上就是一個指標,函式名指向該函式的程式碼在記憶體中的首地址。 
       然後就是可愛的main()函數了,它的第一句您應該看得懂了——它將函式glFun的地址賦值給變數pFun。main()函式的第二句中“*pFun”顯然是取pFun所指向地址的內容,當然也就是取出了函式glFun()的內容,然後給定引數為2。 
(二)使用typedef更直觀更方便。

 
//形式2:typedef 返回型別(*新型別)(引數表) 
typedef char (*PTRFUN)(int); 
PTRFUN pFun; 
char glFun(int a){ return;} 
void main() 

    pFun = glFun; 
    (*pFun)(2); 
}
 
      typedef的功能是定義新的型別。第一句就是定義了一種PTRFUN的型別,並定義這種型別為指向某種函式的指標,這種函式以一個int為引數並返回char型別。後面就可以像使用int,char一樣使用PTRFUN了。 
      第二行的程式碼便使用這個新型別定義了變數pFun,此時就可以像使用形式1一樣使用這個變量了。

(三)在C++類中使用函式指標。 
//形式3:typedef 返回型別(類名::*新型別)(引數表)class CA 

 public: 
          char lcFun(int a){ return; } 
}; 
CA ca; 
typedef char (CA::*PTRFUN)(int); 
PTRFUN pFun; 
void main() 

    pFun = CA::lcFun; 
    ca.(*pFun)(2); 
}
 
     在這裡,指標的定義與使用都加上了“類限制”或“物件”,用來指明指標指向的函式是那個類的這裡的類物件也可以是使用new得到的。比如: 
CA *pca = new CA; 
pca->(*pFun)(2); 
delete pca;
 
     而且這個類物件指標可以是類內部成員變數,你甚至可以使用this指標。比如: 
     類CA有成員變數PTRFUN m_pfun; 
void CA::lcFun2() 
{  
   (this->*m_pFun)(2); 
}
 
     一句話,使用類成員函式指標必須有“->*”或“.*”的呼叫。