連結串列結構體定義LNode,*LinkList以及typedef
連結串列:線性表的鏈式儲存結構
連結串列結構體定義LNode,*LinkList的理解
程式碼分析:
typedef struct node{
datatype data;
struct node* next;
}linknode,*linklist;
以上程式碼可以分解為:
typedef struct node linknode; //將結構體型別struct node重新命名為linknode
typedef struct node *linklist; //將struct node *重新命名為linklist
建立單鏈表
linklist L; //等價於 struct node * L
可以理解為,通過typedef,將struct node *替換為linklist,當我們在使用LinkList L定義變數時,實際上就是在使用 struct node * L定義變數。使得以後想定義指向struct node型別的指標變數時,不需要寫struct node * ,只需要使用LinkList,減少了程式碼的書寫。
可理解為:
linklist = struct node *
後續malloc時候,返回值為void*型,寫法如下:
linklist L;
L = (linklist)malloc(sizeof(linknode));
對於typedef
1.概述:typedef本身是一種儲存類的關鍵字,與auto,extern,static,register等關鍵字不能出現在同一個表示式中
2.作用:使用typedef定義新型別
int a; ———— 傳統變數宣告表示式
int myint_t; ———— 使用新的型別名myint_t替換變數名a
typedef int myint_t; ———— 在語句開頭加上typedef關鍵字,myint_t就是我們定義的新型別
上述程式碼中的:typedef int datatype;就是如此。
typedef的作用有以下幾點:
1)typedef的一個重要用途是定義機器無關的型別。例如,定義一個叫REAL的浮點型別,該浮點型別在目標機器上可以獲得最高的精度:
typedef long double REAL;
如果在不支援 long double 的機器上執行相關程式碼,只需要對對應的typedef語句進行修改,例如:
typedef double REAL;
或者:
typedef float REAL;
2)使用typedef為現有型別建立別名,給變數定義一個易於記憶且意義明確的新名字。例如:
typedef unsigned int UINT
3)使用typedef簡化一些比較複雜的型別宣告,例如:
typedef void (*PFunCallBack)(char* pMsg, unsigned int nMsgLen);
上述宣告引入了PFunCallBack型別作為函式指標的同義字,該函式有兩個型別分別為char*和unsigned int引數,以及一個型別為int的返回值。通常,當某個函式的引數是一個回撥函式時,可能會用到typedef簡化宣告。
3. typedef與#define
兩者的區別如下:
#define進行簡單的進行字串替換。 #define巨集定義可以使用#ifdef、#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。
typedef是為一個型別起新名字。typedef符合(C語言)範圍規則,使用typedef定義的變數型別,其作用範圍限制在所定義的函式或者檔案內(取決於此變數定義的位置),而巨集定義則沒有這種特性。
通常,使用typedef要比使用#define要好,特別是在有指標的場合裡。
下面列舉幾個示例。
3.1 示例1
程式碼如下:
typedef char* pStr1;
#define pStr2 char*
pStr1 s1, s2;
pStr2 s3, s4;
在上述的變數定義中,s1、s2、s3都被定義為char型別;但是s4則定義成了char型別,而不是我們所預期的指標變數char,這是因為#define只做簡單的字串替換,替換後的相關程式碼等同於為:
char* s3, s4;
而使用typedef為char*定義了新型別pStr1後,相關程式碼等同於為:
char *s3, *s4;
3.1 示例2
程式碼如下:
typedef char *pStr;
char string[5]="test";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;
在編譯過程中,報錯如下:
根據錯誤資訊,能夠看出p2為只讀的常量了,所以p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,typedef不是簡單的文字替換,上述程式碼中const pStr p2並不等於const char * p2,pStr是作為一個型別存在的,所以const pStr p2實際上限制了pStr型別的p2變數,對p2常量進行了只讀限制。也就是說,const pStr p2和pStr const p2本質上沒有區別(可類比const int p2和int const p2),都是對變數p2進行只讀限制,只不過此處變數p2的資料型別是我們自己定義的(pStr),而不是系統固有型別(如int)而已。
所以,const pStr p2的含義是:限定資料型別為char *的變數p2為只讀,因此p2++錯誤