看書小記6(《C專家程式設計》)

2021-06-21 21:39:34 字數 2449 閱讀 1230

typedef不常見但值得一提的用途:

1. 用typedef來定義與平台無關的型別。

比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為:

typedef long double real; 

在不支援 long double 的平台二上,改為:

typedef double real; 

在連 double 都不支援的平台三上,改為:

typedef float real; 

也就是說,當跨平台時,只要改下 typedef 本身就行,不用對其他原始碼

做任何修改。

標準庫就廣泛使用了這個技巧,比如size_t。

另外,因為typedef是定義了一種型別的新別名,不是簡單的字串替換。

2.為複雜的宣告定義乙個新的簡單的別名。

方法是:在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。

舉例:(1). 原宣告:int *(*a[5])(int, char*);

變數名為a,直接用乙個新別名pfun替換a就可以了:

typedef int *(*pfun)(int, char*); 

原宣告的最簡化版:

pfun a[5];

(2). 原宣告:void (*b[10]) (void (*)());

變數名為b,先替換右邊部分括號裡的,pfunparam為別名一:

typedef void (*pfunparam)();

再替換左邊的變數b,pfunx為別名二:

typedef void (*pfunx)(pfunparam);

原宣告的最簡化版:

pfunx b[10];

(3). 原宣告:doube(*)() (*e)[9]; 

變數名為e,先替換左邊部分,pfuny為別名一:

typedef double(*pfuny)();

再替換右邊的變數e,pfunparamy為別名二

typedef pfuny (*pfunparamy)[9];

原宣告的最簡化版:

pfunparamy e;

理解複雜宣告舉例:

int (*func)(int *p);

func是乙個函式指標,這類函式具有int*型別的形參,返回值型別是int。

int (*func[5])(int *);

func右邊是乙個運算子,說明func是具有5個元素的陣列;func的左邊有乙個*,說明func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的,原因是運算子優先順序比*高,func先跟結合)。跳出這個括號,看右邊,又遇到圓括號,說明func陣列的元素是函式指標,它指向的函式具有int*型別的形參,返回值型別為int。

記住2個模式:

type (*)(....)-->函式指標 

type (*)    -->陣列指標 

其他:1. typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

//p2++;

p2++編譯出錯。typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。

按照順序,『const pstr』被解釋為『char * const』(乙個指向 char 的常量指標),而不是『const char *』(指向常量 char 的指標)。這個問題很容易解決:

typedef const char * cpstr; int mystrcmp(cpstr, cpstr); // 現在是正確的
記住:不管什麼時候,只要為指標宣告 typedef,那麼都要在最終的 typedef 名稱中加乙個 const,以使得該指標本身是常量,而不是物件。

2. typedef 和儲存

類關鍵字

typedef 就像 auto,extern,mutable,static,和 register 一樣,是乙個儲存類關鍵字。這並不是說 typedef 會真正影響物件的儲存特性,只是在語句構成上,typedef 宣告看起來象 static,extern 等型別的變數宣告。下面將帶到第二個陷阱:

typedef register int fast_counter; // 錯誤
編譯通不過。問題出在你不能在宣告中有多個儲存類關鍵字。因為符號 typedef 已經佔據了儲存類關鍵字的位置,在 typedef 宣告中不能用 register(或任何其他儲存類關鍵字)。

趣味程式設計6 c

高次方數的尾數 求13的13次方的最後三位數。問題分析與演算法設計 解本題最直接的方法是 將13累乘13次後擷取最後三位即可。但是由於計算機所能表示的整數範圍有限,用這種 正確 的演算法 不可能得到正確的結果。事實上,題目僅要求後三位的值,完全沒有 必要求13的13次方的完整結果。研究乘法的規律會發...

《C專家程式設計》筆記6

第六章 運動的詩章 執行時資料結構 a.out 它是assembler output 的縮寫形式 a.out 這個名字是unix 沒什麼理由,但我們就是這麼做的 思維的一例 超級塊 superblock unix 檔案系統中的基礎資料結構 就是用下面這個神奇數字唯一標識的 define ps mag...

C 總複習6 C 程式設計 智慧型指標

1.auto ptr 2.unique ptr 3.shared ptr 4.weak ptr 5.scoped ptr newdelete 容易出現記憶體洩漏 解決方法 自主的記憶體 機制 人為開闢 系統釋放 int p new int 所有權交給棧上的乙個變數 棧 系統開闢 系統釋放 堆 人為開...