關於釋放空間的小細節
1for(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 #include2#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請求是向伺服器端傳送資料的,從而改變資訊,該請求就像資料庫...