例如: #define pi 3.1415926
#define max(a,b) a>b ? a:b
int nrel = max(2,3);
巨集定義簡單來說就是替換,名字上面的純粹複製替代。由於巨集在預處理階段展開,例如上面巨集定義pi,程式在該階段就直接將pi的地方替換成3.1415926,然後執行編譯。
所以巨集定義不額外分配記憶體。
c中是沒有const定義常變數的概念的,這是c++中的應用。
例如: const double pi = 3.1415926;
(注意:常變數在定義時候就必須初始化。這和變數引用是一樣的)
不可以:
const double pi;
pi = 3.1415926; //錯誤
const定義常變數與巨集定義不同之處,它會在編譯階段執行型別檢查。所以常變數定義時一定要表明資料型別。
const定義常變數也不可以修改其值:
const int nnum = 10;
nnum = 100; //錯誤,修改常變數儲存的資料是不對的。
另外常變數最常用的地方是,一些函式希望傳遞過來的形參,不要在該函式內部隨意修改資料。這樣我們可以將函式形參定義為常變數,禁止函式內部修改。
例如統計字串中是否存在空格,只做統計而不修改原字串。可以宣告函式:
bool getstringspace( const char *nzarr , int nlen);
另外,還有一種常引用的應用。如果既要利用引用提高程式效率,又要保護傳遞給函式的資料不在函式中被修改,就使用常引用。
例如:int nrel;
const int &nnum = nrel;
int &ncon = nrel;
nnum = 1; // 錯誤
nrel = 1; //正確
ncon = 2; //正確,常規引用也不可以另做其它變數名的別名,但是可以改變引用變數的值。
char const *p :指向常變數的指標,指向的常量值不可以修改。
const char *p :有人說是指向字元的指標,該指標的值不可以修改。其實實際上和char const *p沒有區別的,因為const和資料型別放置位置沒有前後順序,所以和char const *p等價。
雖然char const *p和const char* p等價,但是還是推薦寫成const char*,因為為了防止和char *const p的區別,同時也更符合大眾讀寫程式的習慣。
例如:
char nza =1;
char nzb =2;
char* const p1 = &nza;
*p1 = 1; //正確,可以修改常量指標指向變數的值;
p1 = &nzb; //錯誤,不可以修改p指向的位址。
*(p1++) =2; //錯誤,也不可以進行位址操作。
char nzarr =;
char nzarr1 =;
char const *p2 = nzarr;
const char *p3 = nzarr; //char* 可以直接等價於 const char*
*p2 = "2222"; //錯誤,不可以修改常量值
*p3 = "2222"; //錯誤,同上
p2 = nzarr1; //正確,可以修改指標指向的位址
p3 = nzarr1; //正確,同上
define巨集定義和const常變數區別
1.define是巨集定義,程式在預處理階段將用define定義的內容進行了替換。因此程式執行時,常量表中並沒有用define定義的常量,系統不為它分配記憶體。const定義的常量,在程式執行時在常量表中,系統為它分配記憶體。2.define定義的常量,預處理時只是直接進行了替換。所以編譯時不能進行...
巨集定義中的 和 的區別
代表和乙個字串相連線 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。舉例如下 巨集定義如下 1 define dev file name dev test kft define open file fd,n 如此呼叫 open file fd1,1 open file fd2,2 open ...
巨集定義中的 和 的區別
剛才測試了巨集定義中的 和 的區別,希望能對大家有點幫助。結果如下 代表和乙個字串相連線 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。舉例如下 巨集定義如下 1 如此呼叫 用gcc e展開後,如下 如果沒有定義dev file name 就是 所以可以很清楚的看出 n 解析出來的是 n 用...