C C 中巨集定義和常變數的區別

2021-07-22 21:48:35 字數 1916 閱讀 9205

例如:       #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 用...