C 專家程式設計

2021-05-28 08:11:47 字數 3765 閱讀 3505

2011.9.4

c 專家程式設計 

1)容易混淆的

const:

關鍵字const

並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部(甚至外部,其它函式)的方法來修改它。

const

最有用支出是用來限定函式的形參,這樣該函式不會修改實參指標所指的資料。但其他函式可能修改它,這是c和

c++中

const

最常的用法。

示例**:

const int limit = 10;

//limit

是乙個常量整型(唯讀) ,

const

修飾int

const int *limitp = &limit;

//limitp是乙個指向常量整型的指標,指標值為

limit

的的值,指標值可變。

int i = 27;

limitp = &i; //limitp指標值指向另外乙個變數

i位址。

這段**表示limitp

是乙個指向常量整型的指標,這個指標不能用於修改這個整型數,但是在任何時刻,指標的值卻是可以改變的,它都可以指向另外乙個位址。就如同,「我給你乙個指向它的指標,你不能用指標來修改它。」

其實const

命名為readonly

更加合適。哈

const float * 表示

float

是乙個指向唯讀

float

型別的指標,

const

限定符不是修飾指標,而是修飾指標指向的型別

/內容。char **  和 

const char ** 

所指的型別不一樣,前者是指向

char *

的指標,後者是指向

const char *

的指標,故型別為

char**

的實參和型別為

const char **

的形參是不相容的。

2)不同編譯器的型別轉化不同:

3)編譯器對無符號型別的乙個bug:

這裡的條件語句並不為真,因為sizeof

()返回的是

unsignd

型別,故在進行判斷的時候,

d被編譯器轉化為

unsigned

型別,-1

對應的無符號整型是很大的,故這裡的條件不可能成立。這個

bug在

ansi c 

和k&r c

中都存在。如果需要修正,可以進行強型別轉化:

if(

d <= int (total_element )  - 2 )

建議:

1)無論什麼時刻,看到「

malloc

(strlen

(str

));」這條語句,幾乎都可以認為是錯誤的,

「malloc

(strlen

(str

)+ 1

);」才正確。因為其他的字串處理函式幾乎都包含了乙個額外的空間,用於容納字串結尾的『

\0』字元。

2)乙個l的

nul : ascii 

字串零的位模式,即表示字串的結束

兩個l的null: 

指向空的指標。

3)多做之過:

4)誤做之過:

過載問題:

p = n*sizeof *q; //這裡只有乙個乘號,

sizeof

自動把*q

作為運算元,相當於

p = n * sizeof (*q); 

r = malloc(q);

注意:當sizeof

運算元是型別名時,則必須新增(),例如 

sizeof

(char

),這常常讓人們誤以為它是個函式,但運算元是變數時則不需要加括號。

運算子優先順序:

結合性:操作符優先順序相同的情況下,就出現了左/

右結合性

注意:所有的賦值語句(包括復合賦值符)都具有右結合性(a=b=c)

,而具有左結合性如位操作符(

& 和 

| ),

1、typedef 

與 define 

的區別:

//定義型別別名,不可擴充套件成

usinged char_p c;

來定義,連續定義的型別能夠保證宣告中所有的變數均為同一型別,而

#define

定義的型別則無法保證

#typedef  char *  char_p  

char_p a,b,c;//a,b,c三個都是

char

型指標

//巨集文本替換

,可以用於擴充套件成

usinged int_p a;

來定義,

#define  int_p  int *

int_p a,b,c;//只有a是

int型指標,

b,c為

int整型變數,即

int (*a),b,c;

2、 typedef struct my_tagmy_type;

struct my_tag variable_1;

my_type variable_2;

這個typedef

宣告引入了

my_type

這個別名作為「

struct my_tag

」的簡寫形式,但它同時也引入了結構標籤

my_tag.

效果即相當於使用了結構標籤

struct my_tag variable_1

,也使用了結構型別

my_type variable_2;

而struct my_tagmy_type;

和加了typedef

的不一樣,只能使用結構標籤

struct my_tag variable_3

;進行定義,而

my_type variable_3;

則是錯誤的。

用typedef

進行簡化的用法1:

原型:void ( *signal( int sig , void (*func)(int) ) ) (int) 

化簡:typedef void (*ptr_to_func)(int);

ptr_to_func signal(int,ptr_to_func);

用typedef

進行簡化的用法2(

強型別轉換的簡化):

typedef int (*ptr_to_int_fun)(void);

char *p;...

= (ptr_to_int_fun) p;

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

c專家程式設計

pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...

c專家程式設計

近來,看了一下 c專家程式設計 這本書,還是有一點收穫吧!也許,我的水平還不適合讀這本書吧!但是,將書中的一些注意點記在這兒。1.要使二個賦值形式合法,必須滿足一下條件 二個運算元都是指向有限定符或者無限定符的相容型別指標,左邊指標所指向的型別必須具有右邊指標指向型別的全部限定符。比如 char c...