讀《C專家程式設計》筆記 第三章 分析C語言的宣告

2021-07-06 04:14:18 字數 1695 閱讀 8122

typedef為一種型別引入新的名字,而不是為變數分配空間。在某些方面typedef類似於巨集文本替換-它並沒有引入新型別,而是為現有型別取個新名字,但他們之間存在乙個關鍵性的區別。typedef看上去跟變數宣告完全一樣,普通的宣告表示「這個名字是乙個指定型別的變數」,而typedef關鍵字並不建立乙個變數,而是宣稱「這個名字是指定型別的同義詞」。

必須注意typedef的缺點,他同樣具有與其他宣告一樣的混亂語法,同樣可以把幾個宣告塞到乙個宣告中去。對於結構,除了可以在書寫時省掉struct關鍵字之外,typedef並不能提供顯著的好處,而少寫乙個struct並沒有多大幫助。在任何typedef宣告中,甚至不必把typedef房子啊宣告的開始位置。

關於操作宣告器的一些提示。不要在乙個typedef中放入幾個宣告器,如下所示:

typedef int

*ptr, (*fun)(), arr[5];

/*ptr 是「指向int 的指標型別」

/*fun 是「指向返回值為int 的函式指標」

/*arr 是「長度為5的int 型陣列「

千萬不要把typedef嵌到宣告的中間部分,如下所示:

unsigned

const

long

typedef

intvolatile *kumquat;

在typedef和巨集文本替換之間存在乙個關鍵性區別。正確思考這個問題的方法就是把typedef看成是以一種徹底」封裝「型別-在宣告它之後不能再往裡增加別的東西。他和巨集的區別體現在兩個方面。

首先,可以用其他型別說明符對巨集定義型別名進行擴充套件,但對typedef所定義的型別名卻不能這樣做。如下所示:

#define peach int 

unsigned peach i;/*沒問題*/

typedef

int banana;

unsigned banana i;/*錯誤!非法*/

其次,在連續幾個變數宣告中,用typedef定義的型別能夠保證宣告中所有的變數均為同一種型別,而用define定義的型別則無法保證,如下所示:

#define int_ptr int *

int_ptr chalk,cheese;

經過巨集擴充套件,第二行變為:

int *chalk,cheese;

這使得chalk和cheese成為不同的型別;chalk是乙個指向int 型別的指標,而cheese則是乙個int。相反,下面的**中:

typedef

char* char_ptr;

char_ptr bentley,rolls_royce;

bentley和rolls_royce的型別依然吸納共同。雖然前面的型別名變了,但他們的型別相同,都是指向char的指標。

不要為了方便起見對結構使用typedef。這樣做的唯一好處就是少寫乙個struct。typedef應該用在:

- 陣列、結構、指標以及函式的組合型別;

- 可移植型別。比如當你需要一種至少20位元型別時,可以對它進行typedef操作typedef的提示宣告。這樣,當把**移植到不同的平台時,要選擇正確的型別如 short,int,long,時,只要在typedef中進行修改就可以了,無需對每個宣告都加以修改。

- typedef也可以為後面的強制型別轉換提供乙個簡單的名字。

C專家程式設計 第三章 分析C語言的宣告

1 關於const的宣告 const int p 指標p指向的內容不變 int const p 指標p指向的內容不變 int const p 指標p不變 const int const p 指標和指標指向的內容都不變 int const const p 指標和指標指向的內容都不變。2 一些合法的宣告...

C 程式設計 第三章 函式

int r i r為i的引用1 定義引用的時候必須初始化,使其指向乙個存在的物件 2 一旦定義以後就與物件繫結,不允許修改 3 當用引用作為函式的引數時,其效果和用指標作為函式引數的效果相當,此時函式中對形參的各種操作實際上是對實參本身進行操作,而非簡單的將實參變數或物件的值拷貝給形參 4 使用引用...

C 語言程式設計 第三章

函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...