《C語言介面與實現》 關於不透明指標

2022-07-18 00:21:13 字數 1096 閱讀 1293

在《c語言介面與實現:建立可重用軟體的技術》一書中,提到了不透明指標:

c語言中常使用typedef定義,比如:

typedef

struct stack *stack_t;

該定義表示乙個指向棧結構的指標,但並沒有給出結構的任何資訊,所以stack_t是乙個不透明指標型別,客戶程式可以自由的操縱這種指標,但無法反引用,即無法檢視指標所指向結構的內部資訊,只有介面的實現才有這種特權。

好處:不透明指標隱藏了實現細節,有助於捕獲錯誤。即只能傳相同型別的引數給函式,否則將產生變異錯誤。例外是引數中有void型指標

void *型指標作為一種通用的指標,可以和其它任何型別的指標(函式指標除外)相互轉化而不需要型別強制轉換,但不能對它進行解引用及下標操作。c語言中的malloc函式的返回值就是乙個void *型指標,我們可以把它直接賦給乙個其他型別的指標,但從安全的程式設計風格角度以及相容性上講,最好還是將返回的指標強制轉換為所需的型別,另外,malloc在無法滿足請求時會通過返回乙個空指標來作為「記憶體分配失敗」的訊號,所以要注意返回值指標的判空。

該書經常使用類似如下**

#define t stack_t

typedef

struct t *t;

...#undef t

用t去封裝adt介面中的主要型別,上面的**的意思是:

(1)有乙個結構體stack_t;

(2)有乙個指標,命名也是stack_t,並且指向結構體stack_t;

(3)t也就是stack_t。

這種用法作者稱為語法糖(syntactic sugar),但我個人認為不是多必要,雖然可以封裝到介面並且是庫里一致,但容易導致誤讀,用的時候到底stack_t是結構還是指標?尤其是需要對庫作修改時會容易出錯。我覺得如下寫法更好:

typedef

struct stack_t

stack, * stackp;

其中stack_t是結構體,stack是定義的結構體型別,stackp是stack_t結構指標,使用如下:

stack stc;//

結構體stackp pstc;//

結構體指標

c語言介面與實現

分類 程式設計 2006 04 13 21 57 7392人閱讀收藏 舉報 語言c 資料結構 c lua exception 書中對atom,list,stack,hashtable,set,ring,exception等都作了 相信看過這邊書後,你使用c程式設計的功力會大為提高。也許使用c 的朋友...

C語言介面與實現 Atom

原子 atom 這一資料結構的工作原理基本類似於拉鍊式雜湊表,每個原子對應唯一的字串,不同的原子對應的字串內容不同 用數學語言講就是在原子和字串之間建立了雙射 原子的特點有三個 其一,每個原子對應的字串是不可變的 其二,相同內容的字串只會儲存一次,節省了儲存空間 其三,比較兩個字串是否相同時不必知道...

《c語言介面與實現》讀後感

書中對atom,list,stack,hashtable,set,ring,exception等都作了 相信看過這邊書後,你使用c程式設計的功力會大為提高。也許使用c 的朋友會認為這些c 的標準模板庫都可以實現,因此對c封裝這些不屑一顧。但是即使是c 程式設計師,我相信你看過本書後,就不會這麼認為了...