c的小細節不定時總結

2022-07-28 07:45:16 字數 2113 閱讀 8065

關於釋放空間的小細節

1

for(p = head; p != null; p = p->next) //

錯誤的**段

2 free(p);

3for(p = head; p != null; p = q)

多維陣列int daytab[2][13]作為變元傳遞給函式f,則f的說明:f(int daytab[2][13])或f(int daytab[13])或f(int (*daytab)[13]),見c程式語言p95

在求陣列元素a[i]的值時,c語言是先將其轉換為*(a+i)的形式軟後再求值,因而在程式中這兩種形式等價。當把取位址運算子&應用於這兩種等價的形式時,尅知道&a[i]和a+i的含義也是相同的。如果pa是乙個指標,那麼表示式中可使用具有下標的指標pa,pa[i]與*(pa+i)的含義一樣。但是,陣列名和指標有區別,pa=a和pa++是合法的,但是a=pa和a++是非法的。此外,如果不越界的話,還有這樣訪問陣列的pa[-1],pa[-2]……

static修飾外部變數或外部函式時,此變數或函式都只能在本源程式檔案中使用。見《c程式語言》p69

static修飾內部變數時,此變數只能在本函式中使用,並且一直佔據儲存空間。

下面說一下巨集定義(或稱之為巨集替換)的用法:

1) 形式:

#define 名字 替換文字

名字後可以接任意字串,名字和define以及替換文字用空白字元分割。替換文字如果比較長,需要換行書寫,那麼需要在行尾加上\

2) 作用域:

從定義處到檔案的結束

3) 帶有變元的巨集定義

乙個最常見的例子是:

#define max(a,b) ((a) > (b) ? (a) : (b) ) // 帶有變元

a,b這裡僅僅是乙個替換,而不涉及到引數傳遞的問題,因此,絕對不能把

max() 看為乙個函式,比如說:

max(i++,j);

這裡i++只是單純的被替換而已,所以,等同於:

i++ > j ? i++ : j

這樣就做了2次加一運算

另外還可能出現的問題,比如

#define square(x) x*x

假如是square(i+2);

那麼替換之後為 i+2*i+2,等價於 i + (2 * i) +2 ,結果顯然和 (i +

2) * (i + 2) 不同

4) #變元 的含義

#define print(a) printf(#a);

這裡#a 等價於 "a"。也就是說 #變元 被替換成為 "變元"

假如輸入 print("a"),這裡 " 被替換成為 \" , \ 替換成為 \\

5) ## 的含義

##表示連線,比如 a##b 就等價與 ab ,注意不是

"ab"(區別於#)

#define test(a) a##b; 這裡先會替換a,再連線,比如 test(int),a##b

就等價與 inta

例項,編寫乙個swap巨集,能夠交換兩個變數的值

1 #include 

2#define swap(type,a,b) \

3 type tmp##type;\

4 tmp##type = a;\

5 a = b;\

6 b = tmp##type;78

int main()

結果:a = 2

b = 1

c = b

d = a

這裡要注意的是:

1) 以下**是無法通過編譯的:

#define swap(type,a,b) \

type tmp;\

tmp##type = a;\

a = b;\

b = tmp;

int main()

因為,swap會被替換兩次,替換之後就會得到這樣的語句:

int tmp;

char tmp;

這裡明顯的重複定義了。

因此,不論怎麼樣,一定要記住,巨集定義僅僅是替換而已和函式不同

2) 因為是簡單的替換,所以不用這樣的呼叫方式:

swap(int,&a,&b); swap不是乙個函式,沒有形參和實參

C 實用程式設計小技巧(不定時更新)

棧的定義及入棧出棧操作 include 定義 stack stk 入棧 stk.push 列印並出棧 while stk.empty cout 字串 int 引入標頭檔案 include string s to string int n int 字串 利用標準庫中的atoi函式 可以過濾掉字首0 s...

JDBC總結(不定時更新)

那些名詞 jdbc配置 註冊驅動器類 解壓jar包可以找到driver.class其路徑即是名字 法一 class.forname com.mysql.jdbc.driver 法二 system.setproperty jdbc.drivers com.mysql.jdbc.driver mysql...

Ajax的小知識(不定時更新)

1 get請求會向資料庫發索取資料的請求,從而來獲取資訊,該請求就像資料庫的select操作一樣,只是用來查詢一下資料,不會修改 增加資料,不會影響資源的內容,即該請求不會產生 無論進行多少次操作,結果都是一樣的。2 與get不同的是,put請求是向伺服器端傳送資料的,從而改變資訊,該請求就像資料庫...