宏定義參數沒有類型判斷,宏定義在編譯的時候就已經計算好了,是以效率比一般函數要高。
#define mul(a,b) ((a)*(b))
預處理指令
條件判斷預處理指令,如果條件成立則預編譯
#if 條件1
..code1..
#else if 條件2
..code2..
#define NUM 10
#if NUM > 0
printf("NUM>0");
#elif NUM==0
printf("NUM=0");
#else
printf("NUM<0");
#endif
return0;
如果定義了某個宏,就預處理
#define MAX 10
#ifdef MAX
..code..
#ifndef MAX
在建立一個頭檔案的時候都寫上,重新建立一個.h檔案都會自動生成這麼一段的
#ifndef include_Header_h
#define include_Header_h
#end if
這樣才能放心的在main函數中引用這些頭檔案而不擔心重複引用
局部變量和全局變量
void test()
{
//全局變量和靜态變量
//靜态變量static修飾的也是全局變量
//b是一個局部變量,自動變量
int b=0;
b++;
//C是一個局部變量,靜态變量
staticint c= 0;
c++;
printf("b=%d,c=%d\n",b,c);
}
運作結果:
b=1,c=1;
b=1,c=2;
b=1,c=3;
解釋:因為b變量是局部變量,生命周期随着函數的銷毀而銷毀,是以在每次調用test函數的時候,b變量都被重新建立,重新指派為0,是以每次列印出來都是1;而c變量是static變量,它被建立以後生命周期是随着程式的結束而結束的,是以在第二次調用這個函數的時候,就不需要建立c變量了,隻要在原來的基礎上繼續添加就行了!static變量并不是在編譯的時候建立的,還是在運作的過程中建立的,雖然生命周期改變,但是作用範圍是不變的。
寄存器變量(register)本身也是自動變量,當函數結束時候,寄存器變量消失,當寄存器不夠用的時候,會自動變成自動變量
//一開始定義的p是指向一個靜态區域,不可以改變*p了
char *p="ABC";
printf("%c",*p);
*p="d";
printf("%c",*p);
void func(int *a)跟void func(int a[100])是一樣的效果
int k=sizeof(a);這裡k是一個指針的大小結果:k=8;
函數的形參本身就 開辟了空間 大小跟形參沒有關系,好比void func(int a[10000000])随便形參數組有多大,都是一個指針的大小,如果要再func函數中計算main函數中傳過來的數組空間的大小,那隻能是char形式的,用strlen(p)來計算(char *p)
//
int main(int argc, constchar * argv[])
int a[]={2,3,4,5,6,7};
int *p=&a[0];
printf("%d ",*p);
p=&a+1;
printf("%d ",*(p-1));
p=&a;
printf("%d ",sizeof(&a));
printf("%d ",sizeof(&a+1));
p=(int *)(&a+1);
return0;
結果:2 7 2 8 8 7 這裡&數組名 是指數組的整個大小
const 是常量
遞歸求N!
本文轉蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366447,如需轉載請自行聯系原作者